Linux TCP Stack — уведомление о сбросе однорангового узла или обрыве соединения

у меня ситуация -

Имеется TCP-соединение между A-->B в установленном состоянии. A посылает несколько байтов B, а затем завершает работу. B не выполняет ни send(), ни recv().

Я хотел бы знать, есть ли способ узнать, что соединение разорвано.

Я знаю, что для разорванных соединений recv() возвращает «0». Но в приведенной выше ситуации - A отправил некоторые данные B, поэтому первый (один или несколько) recv() вернет мне отправленные данные, и, наконец, я получу recv() == 0. Но я хочу знать о разорванное соединение, без необходимости выкачивать все данные из recv-буфера.

  1. Я хочу получать уведомления о входящих пакетах FIN/RST
  2. У меня активирована поддержка активности, поэтому я хотел бы получать уведомление, когда партнер не отвечает на пакет проверки активности.

Спасибо, Сандип


person pppsandeep    schedule 27.08.2012    source источник


Ответы (1)


Везде, где вы хотите проверить живое соединение, вы можете попробовать send(fd, buf, 0, 0), т.е. отправить 0 байтов данных. Если соединение разорвано, оно потерпит неудачу.

person Rohan    schedule 27.08.2012
comment
Если cсоединение уже известно, что оно разорвано на этом конце, оно может выйти из строя. Например, если уже был тайм-аут повторной передачи или был получен RST. Этот метод не обнаружит соединение, которое только что было разорвано после успешной передачи. - person user207421; 28.08.2012
comment
Кроме того... Мне нужно какое-то "уведомление" из стека, когда соединение разрывается. Конструкция такова, что не подходит для запроса стека через send() или recv(). - person pppsandeep; 28.08.2012
comment
@pppsandeep Не повезло, в TCP такого нет. - person user207421; 28.08.2012