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