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本身有更好的解決方案,這裏只是爲了演示。
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 1244
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章