В случае блокирующего вызова recv, если система на стороне партнера перезагружается, вызов не приходит из recv.Зачем? - PullRequest
2 голосов
/ 30 августа 2010

Когда мой код находится в блокирующем вызове recv, если другая сторона перезагружается, тогда этот вызов recv не узнает об этом и просто переходит в состояние зависания.

Как этого избежать?

1 Ответ

8 голосов
/ 30 августа 2010

По умолчанию, если другая сторона соединения исчезает без правильного разрыва соединения, ОС на вашей стороне не может знать, что больше никаких данных не поступит.Вот почему recv() будет блокировать навсегда в этой ситуации.

Если вы хотите установить таймаут, установите неблокируемый сокет и используйте select(), чтобы дождаться, пока он станет читаемым.select() позволяет указать время ожидания.

В качестве альтернативы, вы можете установить опцию SO_KEEPALIVE socket с помощью setsockopt().Это позволит отправлять TCP "keepalive", что позволит вашей стороне обнаружить устаревшее соединение.(Обратите внимание, что при настройках по умолчанию long может потребоваться время, чтобы обнаружить, что соединение разорвано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...