2

我通过 TCP 套接字发送和接收 JSON 数据。当数据量较小时,它可以正常工作,例如 200 字节左右。但是当它达到大约 10 KB 时,它只接收部分数据。我已经尝试了所有我能找到的不同的 TCP 套接字检索数据命令(读取、获取、gets.chomp、recv),但我找不到适用于所有测试的命令。

这是我现在拥有的代码:

socket = TCPSocket.new '10.11.50.xx', 13338
response = socket.recv(1000000000)

我也尝试过添加超时,但我无法让它工作:

socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, 1)

我不确定我错过了什么。任何帮助,将不胜感激。

4

1 回答 1

3

它在 Ruby 文档中的记录很糟糕TCPSocket#recv,但我认为实际上只是调用了recv系统调用。那个(请参阅man 2 recv参考资料)从由内核确定的流中读取多个字节,但从不超过应用程序指定的字节数。要接收更大的“消息”,您需要循环调用它。

但是有一种更简单的方法:因为TCPSocket间接继承自IO该类,所以您可以免费获得它的所有方法,包括IO#read读取您指定的尽可能多的字节(如果可能的话)。

您还需要实现一种方法来分隔您的消息:

  • 使用固定长度的消息
  • 在(固定大小)标头中预先发送消息的长度
  • 使用某种终止符,例如 NULL 字节
于 2013-09-26T20:35:43.973 回答