通过套接字发送确切的字节数

use*_*836 0 erlang gen-tcp

我已经在使用gen_tcp的Erlang中读到了通过套接字发送的数据可以在单个流中聚合.如何强制套接字发送完全特定数量的字节?

joh*_*hlo 5

TCP是一种流协议(与面向数据包的UDP不同),例如,这意味着接收应用程序无法判断可用数据是否来自send()客户端上的一个或多个呼叫.

您实际上无法控制TCP数据包中发送的字节数,多次send()调用可能导致接收到一个TCP数据包,一次send()调用可能导致发送多个TCP数据包.这由OS TCP堆栈控制.

在二郎你可以使用套接字选项{packet, 1|2|4}gen_tcp:connectgen_tcp:listen创建TCP数据的面向数据包的处理.这将插入1,2或4字节的前缀给每个send()和接收侧(假设它也Erlang和使用相同的{packet, N}选项),直到已经接收到的字节数发送的将读出的数据,而不管该消息是如何分段成TCP数据包.

调用gen_tcp:recv将阻塞,直到读取了预期的字节数.对于活动模式套接字,消息以预期的字节数发送.