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