【问题标题】:Socket.recv works but not gets or read?Socket.recv 有效但不能获取或读取?
【发布时间】:2011-02-28 13:10:28
【问题描述】:

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

服务器:

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 是不必要的(以及非红宝石命名方案),但我不明白为什么read 不起作用而recv 起作用,这是为什么呢?

【问题讨论】:

  • 如果有人在损坏的示例中发现了这一点,我有一个不同的 IP 地址。忽略,复制粘贴的时候忘记改了
  • 看看这个相关问题:stackoverflow.com/questions/1147852/…
  • 你的两个客户对我来说都很好。我在 OS X Snow Leopard 上。
  • @mark Arch Linux 并在 OpenBSD 上测试过
  • 我在这里也有类似的问题。 socket.read 从未收到任何回复。 socket.recv(4096) 效果很好。任何机会sockert.read 期望\r\n

标签: ruby networking sockets


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2015-12-02
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多