我已经在 Erlang 中使用 gen_tcp 阅读过,通过套接字发送的数据可以聚合在一个流中。如何强制套接字准确发送特定数量的字节?
问问题
737 次
1 回答
5
TCP 是一种流协议(与面向数据包的 UDP 不同),这意味着接收应用程序无法判断可用数据是否来自send()
客户端上的一个或多个调用。
您实际上无法控制 TCP 数据包中发送的字节数,多次send()
调用可能会导致接收到一个 TCP 数据包,而一次send()
调用可能会导致发送多个 TCP 数据包。这由 OS TCP 堆栈控制。
在 Erlang 中,您可以使用套接字选项{packet, 1|2|4}
来创建面向数据包的 TCP 数据处理。这将为每个插入一个 1,2 或 4 个字节的前缀,并且接收方(假设它也是 erlang 并使用相同的选项)将读取数据,直到接收到发送的字节数,而不管消息如何分段到 TCP数据包。gen_tcp:connect
gen_tcp:listen
send()
{packet, N}
调用gen_tcp:recv
将阻塞,直到读取了预期的字节数。与活动模式套接字相同,消息以预期的字节数发送。
于 2012-09-17T11:37:17.740 回答