Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Закрыть сокет наверняка |
Автор: nerdy_weirdie 30.3.2011, 12:50 | ||
Добрый день. Тема уже поднималась, но надежного решения я так и не увидел. Есть сервер, обслуживающий клиентов. Работает на основе ТСР. После завершения сеанса некоторый небольшой процент соединений остается висеть вечно в состоянии CLOSE_WAIT после закрытия сокета. Где-то 1 из 1000. В результате система со временем падает. Закрытие сокета всегда происходит следующим образом
timed_recv исключений не выбрасывает, реализована при помощи select, recv. Как реализовать надежное и универсальное закрытие сокетов чтобы не оставалось CLOSE_WAIT? |
Автор: boostcoder 30.3.2011, 13:15 |
какая функция возвращает это? |
Автор: nerdy_weirdie 30.3.2011, 16:26 | ||
Это я нетстатом смотрю перечень сокетов в системе. Кстати да, система Windows Server 2003. Компилировал в VS2005. |
Автор: nerdy_weirdie 30.3.2011, 22:25 | ||
Добавил
|
Автор: nerdy_weirdie 31.3.2011, 13:11 |
Ё-маё, неужели никто свой серверный апп никогда до ума не доводил? |
Автор: Олег2005 3.4.2011, 19:51 |
На полученный от клиента сегмент FIN TCP-модуль сервера отсылает клиенту ACK и переходит в состояние CLOSE_WAIT. Сокет клиента, получив этот ACK от сервера, переходит в состояние FIN_WAIT_2, ожидая FIN от сервера. Чтобы отослать клиенту FIN, сервер должен со своей стороны вызвать shutdown(sd, SHUT_WR). В некоторых руководствах сказано, что close() на серверном сокете автоматически выполняет и shutdown(), но в ходе экспериментов на RED HAT 9 было выяснено, что это не так и следует вызывать shutdown(sd, SHUT_WR) явно, иначе после close() серверный сокет так и останется висеть в CLOSE_WAIT, а клиентский в FIN_WAIT_2 (т.е. будут orphan'ами). Думаю что и на виндах так надо делать - во всяком случае пробоватьь |