使用Ruby TCPSocket指定数据包大小

时间:2009-11-02 13:31:32

标签: ruby sockets

我正在使用Ruby来测试使用套接字的C#网络应用程序。我打开与@socket = TCPSocket.new(IP,PORT)的连接并且它有效 - 直到我要发送的文本超过1024个字符。然后Ruby将消息分成两部分。 C ++和C#将消息作为一个数据包发送,因此C#应用程序不需要加入这些部分。

消息永远不会超过约。 2000个字符。是否有可能为TCPSocket设置数据包大小?

编辑: 你的所有答案都是正确的,但在阅读了很多关于ruby套接字的问题后,我找到了解决方案:

socket.send(msg,0x4)

不拆分邮件。直接发送选项有所不同。

我不知道这是否适用于互联网,但它可以在我的测试实验室中使用。

请求帮助。

2 个答案:

答案 0 :(得分:1)

TCP是一种流协议。它不关心应用程序“消息”。从理论上讲,TCP可以在一个数据包或1024个数据包中发送1024个字节。 也就是说,请记住以太网MTU是1500字节。因子IP header,通常为20,TCP header,至少为20.然后,您的2000-char消息必须至少发送两个数据包。 TCP也可以进行流量控制,这可能与问题有关。找出线路上发生的事情的最佳方法是使用tcpdumpwireshark

答案 1 :(得分:0)

传输数据所需的数据包数量在实际应用中对流的影响非常小。您可能遇到的是实施中的缓冲问题。

只应在套接字处于“可写”状态时写入套接字,否则可能会使输出缓冲区溢出并导致连接被网络堆栈丢弃。

由于TCP / IP套接字的作用是一个简单的流,数据进入并按顺序出现,除非对时间敏感的应用程序,否则数据包碎片的影响应该是无关紧要的。

确保在写入套接字时刷新输出缓冲区,或者您可能还有一些数据需要等待传输:

@socket.write(my_data)
@socket.flush