我已经在使用gen_tcp的Erlang中读到了通过套接字发送的数据可以在单个流中聚合.如何强制套接字发送完全特定数量的字节?
TCP是一种流协议(与面向数据包的UDP不同),例如,这意味着接收应用程序无法判断可用数据是否来自send()客户端上的一个或多个呼叫.
您实际上无法控制TCP数据包中发送的字节数,多次send()调用可能导致接收到一个TCP数据包,一次send()调用可能导致发送多个TCP数据包.这由OS TCP堆栈控制.
在二郎你可以使用套接字选项{packet, 1|2|4}来gen_tcp:connect并gen_tcp:listen创建TCP数据的面向数据包的处理.这将插入1,2或4字节的前缀给每个send()和接收侧(假设它也Erlang和使用相同的{packet, N}选项),直到已经接收到的字节数发送的将读出的数据,而不管该消息是如何分段成TCP数据包.
调用gen_tcp:recv将阻塞,直到读取了预期的字节数.对于活动模式套接字,消息以预期的字节数发送.