Насколько я знаю, Keep-alive на TCP-сокете полезно знать, если сокеты не просто открыты, а соединение между этими двумя сокетами действительно живое. Итак, у меня есть пара вопросов, которые я хотел бы спросить относительно использования Keepalive в Winsocks2:
Что происходит, когда опция keep-alive обнаруживает мертвый сокет?
Соединение сбрасывается, и при любом чтении или записи возникает ошибка «Сброс соединения». Обратите внимание, что keepalive отключен по умолчанию, и, если он включен, по умолчанию он работает только с двухчасовыми интервалами.
Как я могу проверить, является ли соединение живым или мертвым, фактически не используя send и recv?
Ты не можешь TCP / IP специально разработан так, чтобы не иметь «тонального сигнала». Так работает намного лучше. Это главная причина, почему он вытеснил все предыдущие протоколы, такие как SNA, которые сделали.
Если мне нужно использовать функции send и recv, тогда какой смысл использовать keep-alive?
recv()
не скажу вам о сломанной связи. Это может просто заблокировать навсегда. Вы можете использовать тайм-ауты чтения, но затем вы должны решить, сколько времени это слишком много. Или вы можете реализовать PING уровня приложения.
Поддержание активности обнаруживает, что сервер на другом конце соединения (или физическая связь, такая как сеть не работает) умер перед тем, как отправить сообщение. В противном случае разъединение обнаруживается только тогда, когда вы действительно пытаетесь отправить данные, что, если по какой-то причине ваше соединение не используется, может занять много времени.