Ruby TCPSocket recv阻塞并永不返回

时间:2010-02-01 16:50:56

标签: ruby networking recv tcpsocket

所以,我有以下代码:

  def LSCPHandler.send_message(message, hostname, port)
s = TCPSocket.open(hostname, port)
s.print message
ret = s.recv(1024)
s.close 
LSCPHandler.parse_error(ret)
return ret  

通常,哪种方法正常。我正在谈论的服务器通常会很快返回响应,一切都很好。

然后,今天,服务器出了问题。不是我的问题,但是,这导致我的整个应用程序挂起,等待recv超时。这不是最佳选择。

如果我不立刻听到回复,有没有办法超时收回?我试着查看ruby文档,但它真的让我困惑(即TCPSocket只实现了三个方法,它们都没有打开或recv,而它的Socket的父类也没有实现这些方法。而Socket的父类似乎是Object ?我一直很困惑)

1 个答案:

答案 0 :(得分:2)

您可以将套接字上的接收超时套接字选项设置为默认值以外的其他选项。棘手的一点是选择一个仍适用于所有用例的合适号码,即你不希望你的recv呼叫过早超时。

s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)