Ruby TCP Socket读取数据截断问题排查及解决方案咨询
关于Ruby TCP服务器接收大数据截断的问题
问题背景
我实现了一个监听指定地址和端口的简单TCP服务器,代码如下:
TCPServer.open(address, port) do |server| file = File.open(file_name, "wb") while client = server.accept while buffer = client.gets() puts buffer file.write(buffer) end end end
使用netcat发送短字符串或小于4096字节的数据时,服务器能完整读取;但发送超过该大小的数据时,即便连接关闭并到达EOF,数据仍会被截断。
我尝试改用另一种TCP服务器实现方式:
one_hundred_kb = 1024 * 100 Socket.tcp_server_loop(address, port) do |connection| begin file = File.open(file_name, "wb") # 按不超过100KB的块读取数据 while data = connection.readpartial(one_hundred_kb) do puts data file.write(data) end rescue EOFError connection.close unless connection.nil? end end
但该方案仍存在相同问题。我找到相关讨论线程,但无法修改客户端的消息发送方式。
请问是否可以修改最大读取大小?数据被截断且无法恢复的原因是什么?
补充信息
编辑1
按照要求,我发送了一个超过4096字节的超长字符串(由大量1组成,末尾带两个xx),服务器端最终数据被截断,xx未显示。
编辑2
通过tcpdump分析netcat生成的流量后发现,实际上是netcat将数据最大长度限制为4096字节。Socket和TCPServer类在与生产客户端配合时均正常工作。此前用netcat测试时出现的问题源于EOF处理缺失(上述Socket类实现已正确处理),这会导致生成损坏的二进制文件。
内容的提问来源于stack exchange,提问作者XvaneD
相关产品推荐
相关产品推荐

