数据包有时会被连接起来

POS*_*DER 5 erlang tcp

我正在尝试在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会从你看到的消息中删除它.所以你在顶部的示例匹配应该仍然可以正常工作