繁体   English   中英

使用Ruby TCPSocket指定数据包大小

[英]Specify packet size with Ruby TCPSocket

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

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

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

socket.send(msg,0x4)

不拆分消息。 直接发送的选项有所不同。

我不知道这是否可以在Internet上使用,但可以在我的测试实验室中使用。

谢谢。

TCP是流协议。 它不关心应用程序的“消息”。 理论上,TCP可以在一个数据包或1024个数据包中发送1024字节。 也就是说,请记住以太网MTU为1500字节。 IP标头 (通常为20)和TCP标头 (至少为20)中考虑因素。那么您的2000个字符的消息将必须至少以两个数据包发送。 TCP还可以进行流量控制,这可能与该问题有关。 找出网络上发生了什么的最好方法是使用tcpdumpwireshark

实际上,传输数据所需的数据包数量对流的影响很小。 您可能遇到的是实现中的缓冲问题。

仅当套接字处于“可写”状态时,才应写入套接字,否则可能会导致输出缓冲区溢出并导致网络堆栈断开连接的风险。

由于TCP / IP套接字的作用就像一个简单的流,数据按顺序传入和传出,因此,数据包分段的影响应该几乎不相关,除了对时间非常敏感的应用程序外。

写入套接字时,请确保刷新输出缓冲区,否则可能还有一些数据等待发送:

@socket.write(my_data)
@socket.flush

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM