Может ли 'connect' call on socket вернуться успешно без вызова сервера 'accept'? - PullRequest
13 голосов
/ 09 марта 2010

Сервер создал сокет и привязал его к порту и запустил поток, который находится в цикле, чтобы принять соединение. Некоторое время спустя цикл завершился из-за исключительной ситуации, приводящей к выходу из потока, но сокет все еще ограничен портом. Теперь, если клиент «подключается» к этому серверу, это происходит успешно. Как это возможно? Если я правильно понимаю, «connect» возвращается только после того, как сервер «принимает» на слушающем сокете. Я что-то здесь упускаю?

Ответы [ 2 ]

22 голосов
/ 09 марта 2010

Если я правильно понимаю, «connect» возвращается только после того, как сервер «принимает» на слушающем сокете. Я что-то здесь упускаю?

Да. TCP устанавливает соединение - трехстороннее рукопожатие - под одеялом и помещает его в завершенную очередь соединений, когда оно будет готово. Accept () возвращает следующее ожидающее соединение с начала этой очереди.

С точки зрения клиента, он «подключен», но не будет ни с кем разговаривать, пока сервер не примет и не начнет обработку. Вроде как, когда вы звоните в компанию и сразу же ставитесь в очередь ожидания. Вы «подключены», но никакого дела не будет, пока кто-то на самом деле не поднимет трубку и не начнет говорить.

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

4 голосов
/ 09 марта 2010

Подключенные сокеты попадают в очередь, ожидая, пока принимающий процесс их примет (). Их количество ограничено, и как только оно будет достигнуто, ОС начнет либо отклонять соединения, либо игнорировать их.

...