Erlang网络编程-Binary

在Erlang里面,Binary支持强大的模式匹配,这为编写网络通讯程序提供了便利。

比如一个协议串,格式如下
HEADER(2 Bytes) ID (1 Byte) MESSAGE(10 Bytes)
可以这样匹配
<<Header:16, Id:8, Message:10/binary-unit:8>>

有一些协议,头部是接下来数据的长度,这样就更简单了
<<Size:8, Content:Size/binary-unit:8>>

一个IPV4的头部可以这样表示
[quote]<<Version:4, IHL:4, TypeOfService:8, TotalLength:16,
Identification:16, FlagX:1, FlagD:1, FlagM:1,
FragmentOffset:13, TTL:8, Protocol:8,
HeaderCheckSum:16, SourceAddress:32,
DestinationAddress:32, Rest/binary>> = Packet.[/quote]


具体应用
比如定义了一个协议,头部2字节为长度,接下来是Body。要接收这样一个包,有可能会不全,也有可能2个包一起接收了,这时候可以这样做:

[code]loop(Socket, Buffer) ->
RecvBinary = gen_tcp:recv(Socket,0),
Binary = list_to_binary(binary_to_list(Buffer) ++ binary_to_list(RecvBinary)),
case Binary of
<<Size:16, Body:Size/binary-unit:8, Remaining/binary>> ->
handleMessage(Body),
loop(Socket, Remain);
<<_/binary>> ->
loop(Socket, Binary)
end.[/code]

这个解决方案还是相当笨拙的,Erlang本身有更好的解决方案,这里只是为了演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值