Socket.recv有效但无法获取或读取?

时间:2010-06-07 04:43:39

标签: ruby networking sockets

您好我一直在使用Ruby中的套接字,并且遇到了一些我尝试修改和破坏的示例代码。我想知道为什么它被打破了。

服务器:

require "socket"  
dts = TCPServer.new('127.0.0.1', 20000)  
loop do  
  Thread.start(dts.accept) do |s|  
  print(s, " is accepted\n")  
  s.write(Time.now)  
  print(s, " is gone\n")  
  s.close  
  end  
end  

有效的客户:

require 'socket'  
streamSock = TCPSocket.new( "127.0.0.1", 20000 )  
streamSock.print( "Hello\n" )  
str = streamSock.recv( 100 )  
print str  
streamSock.close 

破产的客户

require 'socket'  
streamSock = TCPSocket.new( "127.0.0.1", 20000 )  
streamSock.print( "Hello\n" )  
str=streamSock.read #this line modified
print str  
streamSock.close 

我知道streamSock.print是不必要的(以及命名方案是非ruby)但我不明白为什么readrecv执行时不起作用,为什么是这样?

1 个答案:

答案 0 :(得分:0)

非常微妙的竞争条件。您正在关闭连接服务器端而不等待客户端完成。如果您的客户在s.close之前完成,您将得到正确答案,如果服务器首先完成,您将获得Errno :: ECONNRESET。这意味着客户在工作时丢失了连接。

一个简单的解决方法是在关闭连接服务器端之前等待一段固定的时间。足够的时间让客户完成。