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