Что происходит c TCP-соединением при истечении таймаута SO_KEEPALIVE
?
on = 1;
::setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, 1);
В документации сказано только то, что по истечению посылается SIGPIPE.
Что происходит с самим соединением? Закрывается ли при этом сокет?
Upd: Речь про Linux
С точки зрения программиста ситуация после истечения таймаута и отсутствия ответа или неудовлетворительности оного обрабатывается практически также как и корректное закрытие TCP соединения клиентом:
poll
/select
возвращают сокет как готовый для чтенияread
/recv
из оного возвращают ошибку (если верить Стивенсу, процитированному выше, то errno
устанавливается в одно из значений ETIMEDOUT
, ECONNRESET
, EHOSTUNREACH
).write
/send
приведут к посылке сигнала SIGPIPE
и/или возврату ошибки (дабы не соврать не буду утверждать какой именно)Это выдержка из книги "Unix. Разработка сетевых приложений.(Стивенс)". В ней описано почти Всё.
Когда параметр SO_KEEPALIVE установлен для сокета TCP и в течение двух часов не происходит обмена данными по сокету в любом направлении, TCP автоматически посылает собеседнику проверочное сообщение (keepalive probe). Это сообщение — сегмент TCP, на который собеседник должен ответить. Далее события могут развиваться по одному из трех сценариев.
ПРИМЕЧАНИЕ
HP-UX обрабатывает поверочные сообщения так же, как и обычные данные, то есть второе сообщение отсылается по истечении периода повторной передачи, после чего для каждого последующего пакета интервал ожидания удваивается, пока не будет достигнут максимальный интервал (по умолчанию — 10 мин).
Если на все проверочные сообщения TCP не приходит ответа, то ошибка сокета, требующая обработки, устанавливается в ETIMEDOUTи сокет закрывается. Но если сокет получает ошибку ICMP (Internet Control Message Protocol — протокол управляющих сообщений Интернета) в ответ на одно из проверочных сообщений, то возвращается одна из соответствующих ошибок, но сокет также закрывается. Типичная ошибка ICMP в этом сценарии — Host unreachable(Узел недоступен) — указывает на то, что узел собеседника не вышел из строя, а только является недоступным. При этом ошибка, ожидающая обработки, устанавливается в EHOSTUNREACH. Это может произойти из-за отказа сети или при выходе удаленного узла из строя и обнаружении этого последним маршрутизатором.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Доброго времени суток, возникла проблема с освобождением памятиВесь код цельный копипастить не буду,вот элементарная часть в которой уже...
Можно ли вставить system("onboard"); в приложение Qt при его запуски от root?
Задание: перевернуть все части строки, заключенные в скобках, начиная с самого нижнего уровня вложения, удалить сами скобкиДля строки "Code(Cha(lle)nge)"...