Почему функция принятия сокета не освобождается после вызова closesock? - PullRequest
4 голосов
/ 29 октября 2010

У меня есть серверное приложение, которое открывает сокет и прослушивает соединение. В приложении у меня есть отдельный поток, который создает сокет, связывает его и вызывает для него функции listen и accept.

Когда приложение закрывается, я вызываю closesocket на сокете, который был создан, затем жду закрытия потока сокета. Однако, если поток ожидает функции принятия, поток никогда не завершится.

Я думал, что функция accept вернется после вызова cloasesocket. Это правильная мысль? Если так, то почему функция accept не возвращается? Есть ли другой способ заставить функцию accept вернуться?

Ответы [ 3 ]

4 голосов
/ 29 октября 2010

Не звоните accept, если select не скажет, что все в порядке. В этом случае accept никогда не будет блокироваться.

0 голосов
/ 25 августа 2016

Я видел похожую проблему, когда вызовы WSAStartup и WSACleanup не были сбалансированы.

Программа вызывала WSACleanup перед вызовом closesocket.Оба потока, пытающихся закрыть сокет, как и принимающий, будут блокироваться.Когда я удалил «дополнительные» WSACleanup вещи, улучшенные.

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

0 голосов
/ 29 октября 2010

Проверьте справочную страницу ... http://linux.die.net/man/2/accept

accept() блокирует на сокете A, и, когда приходит новое соединение, возвращает новый сокет B для подключения клиента.Часто это происходит в тесном цикле с помощью fork () и exec () для отправки нового соединения дочернему процессу, который обрабатывает соединение, в то время как родитель возвращается в accept () для ожидания другого соединения.

Вы пытаетесь сказать, что другой поток в вашей программе закрывает сокет A из-за вызова accept ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...