2012-09-17 85 views
0

我已阅读,在使用Erlang的发送调用gen_tcp通过套接字中的数据可以在单个流被聚集。我如何强制套接字发送完全特定数量的字节?发送的字节确切数目通过套接字

+1

目前尚不清楚你想解决什么问题。发送的字节数将始终是您指定的数字。它永远不会发送你要求它发送或发送你没有要求发送的字节的字节。 –

+0

我的错误或实际或不同的发送操作可以汇总在一个单一的块? {no_delay,false}应该是标准行为 – user601836

+1

“单个块”是什么意思?如果您指的是您在单个TCP读取操作中获得的数据量,则它是任意的。这是TCP的基本属性,对此您无能为力。 –

回答

5

TCP是一个流协议(UDP不像其面向分组的),其例如也就是说,如果现有的数据来自于客户端上的一个或几个send()调用接收应用程序不能告诉。

你真的没有过的字节数的任何控制在一个TCP数据包被发送,多send()调用可能导致一个TCP数据包被接收,一个send()通话可能会导致一些TCP数据包被发送。这由OS TCP堆栈控制。

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

gen_tcp:recv的调用将阻塞,直到所期望的字节数已经被读取。对于主动模式套接字,消息以预期的字节数发送。