0

我已经在 Erlang 中使用 gen_tcp 阅读过,通过套接字发送的数据可以聚合在一个流中。如何强制套接字准确发送特定数量的字节?

4

1 回答 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:connectgen_tcp:listensend(){packet, N}

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

于 2012-09-17T11:37:17.740 回答