我正在尝试在Erlang中创建一个简单的服务器/应用程序.
我的服务器初始化一个套接字gen_tcp:listen(Port, [list, {active, false}, {keepalive, true}, {nodelay, true}])并与客户端连接gen_tcp:connect(Server, Port, [list, {active, true}, {keepalive, true}, {nodelay, true}]).从服务器收到的消息由诸如此类的警卫进行测试{tcp, _, [115, 58 | Data]}.
问题是,数据包有时会在发送或接收时连接起来,从而导致意外行为,因为警卫认为下一个数据包是变量的一部分.
有没有办法确保每个数据包作为单个消息发送到接收进程?
Dav*_*rth 10
普通TCP是一种没有数据包边界概念的流媒体协议(如Alnitak所说).
通常,您使用框架协议以UDP(每个数据包大小有限且可以无序接收)或TCP发送消息.
Framed意味着您在每条消息前面加上一个大小标题(通常为4个字节),表示消息的长度.
在erlang中,您可以将{packet,4}添加到套接字选项中,以在TCP之上获取成帧数据包行为.
假设双方(客户端/服务器)使用{packet,4},那么您将只获得整个消息.
注意:你不会看到大小标题,erlang会从你看到的消息中删除它.所以你在顶部的示例匹配应该仍然可以正常工作
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |