Ruby: Как определить, когда одна сторона сокета закрыта - PullRequest
11 голосов
/ 30 апреля 2009

Как я могу определить, что сокет полуоткрыт? Я имею в виду случай, когда другая сторона сокета отправила FIN, а приложение Ruby получило этот FIN. Можно ли мне сказать, что сокет находится в этом состоянии?

Взять, к примеру:

require 'socket'

s = TCPServer.new('0.0.0.0', 5010)

loop do
  c = s.accept

  until c.closed?
    p c.recv(1024)
  end
end

В этом случае, когда я telnet в порт 5010, я буду видеть все свои входные данные, пока не закрою сеанс telnet. В этот момент он будет печатать пустые строки снова и снова так быстро, как может.

1 Ответ

1 голос
/ 18 января 2016

Вы используете блокирующий вызов recv, который вернет ноль, когда другой конец закроется. Розетка не будет закрыта, пока вы ее не закроете. Изменение

  until c.closed?
    p c.recv(1024)
  end

до

while (s = c.recv(1024)) && s > 0
   p s
end
c.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...