我正在编写一款Erlang TCP服务器,运行以下协议。
- 每个数据包大小恰好为4字节。
- 有一个特殊情况的数据包 -
<<?SPECIAL_BYTE, 0, PayloadLength:2/big-unsigned-integer-unit:8>>
。此数据包表示服务器必须读取下一个PayloadLength
字节的原始数据。
我可以接收原始数据流并在Erlang代码中解析此协议。但是我想知道是否有任何方法可以使用内置的Erlang数据包封装?当我的数据包以其长度为前缀时,我可以使用[{packet,HeaderLength}]。是否有任何方法可以强制Erlang自动将接收到的数据打包成4字节的块呢?
更新:我计划使用{active,once}模式。我也可以使用gen_tcp:recv(Socket,4),但我担心在这种情况下由于多次套接字读取而导致性能损失。我的担忧是否有道理?