Если через некоторое время функционирование удаленного хоста будет восстановлено, он получит один из повторно переданных пакетов локального хоста. Не зная, что с ним делать, хост передаст сообщение сброса низкого уровня, в котором локальному хосту будет сообщено, что ему в соединении отказано. В этот момент соединение будет разорвано и программа получит либо сообщение EOF, либо сообщение об ошибке в зависимости от выполняемой операции.
Один из способов предотвращения блокировки на неопределенное время состоит в установке опции сокета SO_KEEPALIVE. В этом случае соединение разрывается по тайм-ауту по истечении некоторого периода ожидания ответа, и сокет закрывается. Тайм-аут поддержки соединения, установленный опцией SO_KEEPALIVE, является относительно продолжительным (в некоторых случаях он составляет несколько минут) и не может быть изменен.
Сеть прекращает работать при установленном соединении. Если маршрутизатор или сетевой сегмент прекращает работать при установленном соединении, в результате чего удаленный хост становится недостижимым, текущая операция ввода-вывода блокируется до тех пор, пока связь не будет восстановлена. Однако в этом случае после восстановления сети сеанс обычно продолжается так, как будто ничего не произошло, и операция ввода-вывода завершается успешно.
Однако из этого правила есть несколько исключений. Если один из маршрутизаторов, расположенный по пути следования, вместо того чтобы просто остановиться, начинает выдавать сообщения об ошибках, такие как host unreachable (хост не достижим), то соединение разрывается и возникает ситуация, аналогичная рассматриваемой в начале. Еще одно исключение состоит в том, что удаленный сервер имеет свою систему завершения соединений по тайм-ауту. В таком случае он устанавливает тайм-аут и закрывает соединение, как только связь по сети будет восстановлена.
Итак, сокеты TCP создаются с использованием функции socket(). В клиентской программе для установления исходящего соединения с удаленным хостом вызывается функция connect(). В серверной программе вызывается функция bind() для присвоения сокету адреса, функция listen() - для указания операционной системе, что готов принимать соединения, и функция accept() для приема входящих соединений. После подключения сокет TCP может использоваться для чтения и записи данных подобно дескриптору файла.
Сокеты имеют ряд опций, которые можно устанавливать и определять, соответственно, с помощью функций setsockopt() и getsockopt(). В отличие от дескрипторов файлов, после закрытия которых дальнейшее чтение или запись становятся невозможным, сокеты могут быть закрыты наполовину с использованием функции shutdown() - позволяющей закрыть сокет для чтения, записи.
2013-11-03 02:38:48
это интересно Уже давно не секрет, что наша связь постепенно переходит на технологии IP-Телефонии с передачей информации по цифровым каналам, как частный случай по Интернет. И важен тот факт, что тарифы IP телефонии на порядок ниже тарифов проводной связи, а качество зачастую соизмеримо. Поэтому применение этой технологии с каждым днем все популярнее.