Ruby TCPSocket блокирует recv и никогда не возвращает - PullRequest
0 голосов
/ 01 февраля 2010

Итак, у меня есть следующий код:

  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. Это не совсем оптимально.

Есть ли способ тайм-аута recv, если я не слышу что-то сразу? Я попытался просмотреть документацию по ruby, но это действительно смущает меня (то есть TCPSocket реализует только три метода, ни один из которых не открыт и не recv, и его родительский класс Socket также не реализует эти методы. И родительским классом Socket является Object ? Я в полном замешательстве)

1 Ответ

2 голосов
/ 01 февраля 2010

Вы можете установить параметры сокета тайм-аута приема на сокете в другое значение, отличное от значения по умолчанию. Сложность в том, чтобы выбрать подходящий номер, который по-прежнему работает во всех случаях использования, т. Е. Вы не хотите, чтобы ваш recv звонок слишком рано прерывался.

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