Erlang-China

erlang 中文社区

【转】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

Note: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>