比如一個協議串,格式如下
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本身有更好的解決方案,這裏只是爲了演示。