【转】Erlang网络编程-Binary
原文地址:avindev.javaeye.com
原文作者:AvinDev
在Erlang里面,Binary支持强大的模式匹配,这为编写网络通讯程序提供了便利。
比如一个协议串,格式如下
HEADER(2 Bytes) ID (1 Byte) MESSAGE(10 Bytes)
可以这样匹配
<>
有一些协议,头部是接下来数据的长度,这样就更简单了
<>
一个IPV4的头部可以这样表示
引用
<
Identification:16, FlagX:1, FlagD:1, FlagM:1,
FragmentOffset:13, TTL:8, Protocol:8,
HeaderCheckSum:16, SourceAddress:32,
DestinationAddress:32, Rest/binary>> = Packet.
具体应用
比如定义了一个协议,头部2字节为长度,接下来是Body。要接收这样一个包,有可能会不全,也有可能2个包一起接收了,这时候可以这样做:
代码
1. loop(Socket, Buffer) ->
2. RecvBinary = gen_tcp:recv(Socket,0),
3. Binary = list_to_binary(binary_to_list(Buffer) ++ binary_to_list(RecvBinary)),
4. case Binary of
5. <> ->
6. handleMessage(Body),
7. loop(Socket, Remain);
8. <<_/binary>> ->
9. loop(Socket, Binary)
10. end.
这个解决方案还是相当笨拙的,Erlang本身有更好的解决方案,这里只是为了演示。


Write a Comment