Сокеты TCP и POSIX принимают () семантику - PullRequest
8 голосов
/ 01 апреля 2009

Ситуация: сервер вызывает accept (). Клиент отправляет SYN на сервер. Сервер получает SYN, а затем отправляет SYN / ACK обратно клиенту. Однако клиент теперь зависает / умирает, поэтому он никогда не отправляет ACK обратно на сервер.

Что происходит? Возвращает accept (), как только получит SYN, или блокируется, пока не будет возвращен ACK клиента? Если это блокирует, это в конечном счете истекает?

Ответы [ 4 ]

9 голосов
/ 02 апреля 2009

Звонок на accept() блокируется, пока не будет установлено соединение. До тех пор, пока не завершится трехстороннее рукопожатие, нет соединения , поэтому accept() не должно возвращаться. Для неблокирующих сокетов он не будет блокироваться, но и не даст вам информации о частично завершенных рукопожатиях.

2 голосов
/ 01 апреля 2009

Если клиент никогда не отправляет ACK, accept () блокирует или возвращает EAGAIN, если сокет помечен как неблокирующий.

1 голос
/ 01 апреля 2009

Это в конечном итоге истечет время ожидания, потому что этот сценарий в действительности сталкивается с DoS (отказ в обслуживании) и ресурсом для принятия, возвращаемого для использования операционной системой. if может привести к блокировке мастер-сокета, так как клиент подключается к серверу, как только команда accept возвращает верный файловый дескриптор

В случае, если во время соединения с клиентом происходит ошибка, будет установлено значение errno, и хорошей идеей будет регистрация или отображение сообщения об ошибке. Однако прочитайте справочные страницы, это лучший источник информации в большинстве случаев.

0 голосов
/ 02 апреля 2009

В случае сбоя, скажем, тайм-аута, потому что рукопожатие не завершено, он вернет -1 и установит errno. После просмотра справочной страницы я полагаю, что для нее будет установлено значение ECONNABORTED.

...