RUBY TCPSOCKET RECV Блокировка и никогда не возвращаясь

StackOverflow https://stackoverflow.com/questions/2178413

Вопрос

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

  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, но это действительно путает меня (то есть TCPPSocket только реализует три метода, ни один из них не открывается или RECV, и его родительский класс сокета также не реализует эти методы. И родительский класс Socket ? Я скваживаюсь)

Это было полезно?

Решение

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

s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top