Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрыть сокет наверняка 
:(
    Опции темы
nerdy_weirdie
Дата 30.3.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Добрый день. Тема уже поднималась, но надежного решения я так и не увидел. 
Есть сервер, обслуживающий клиентов. Работает на основе ТСР. После завершения сеанса некоторый небольшой процент соединений остается висеть вечно в состоянии CLOSE_WAIT после закрытия сокета. Где-то 1 из 1000. В результате система со временем падает.
Закрытие сокета всегда происходит следующим образом
Код

        shutdown(m_sockThis,SD_SEND);
        char buf[100];
        int nReceived = 0;
        do
        {
            nReceived = timed_recv(m_sockThis,buf,100,0,10);
        } while(nReceived>0);
        shutdown(m_sockThis,SD_RECEIVE);
        closesocket(m_sockThis);

timed_recv исключений не выбрасывает, реализована при помощи select, recv.
Как реализовать надежное и универсальное закрытие сокетов чтобы не оставалось CLOSE_WAIT?
PM MAIL   Вверх
boostcoder
Дата 30.3.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(nerdy_weirdie @  30.3.2011,  12:50 Найти цитируемый пост)
состоянии CLOSE_WAIT

какая функция возвращает это?

PM WWW   Вверх
nerdy_weirdie
Дата 30.3.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Цитата(boostcoder @ 30.3.2011,  13:15)
Цитата(nerdy_weirdie @  30.3.2011,  12:50 Найти цитируемый пост)
состоянии CLOSE_WAIT

какая функция возвращает это?

Это я нетстатом смотрю перечень сокетов в системе.

Кстати да, система Windows Server 2003. Компилировал в VS2005.

Это сообщение отредактировал(а) nerdy_weirdie - 30.3.2011, 16:34
PM MAIL   Вверх
nerdy_weirdie
Дата 30.3.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Добавил
Код

BOOL bDontLinger = TRUE;
setsockopt(m_sockThis,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(bDontLinger));
не помогает.
PM MAIL   Вверх
nerdy_weirdie
Дата 31.3.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Ё-маё, неужели никто свой серверный апп никогда до ума не доводил?
PM MAIL   Вверх
boostcoder
Дата 31.3.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(nerdy_weirdie @  31.3.2011,  13:11 Найти цитируемый пост)
неужели никто свой серверный апп никогда до ума не доводил?

доводил. но написанный с использованием asio ;)

Добавлено через 2 минуты и 16 секунд
Цитата(nerdy_weirdie @  30.3.2011,  12:50 Найти цитируемый пост)
shutdown(m_sockThis,SD_RECEIVE);

а отправку не пробовали?
так:
Код

shutdown(m_sockThis,SD_BOTH);


Добавлено через 3 минуты и 45 секунд
ааа, отправка запрещена в первой строке smile

Добавлено через 8 минут и 25 секунд
почитайте: http://www.opennet.ru/base/dev/reuses.txt.html
как раз на вашу тему.
ну и отпишитесь, если поможет ;)

Добавлено через 9 минут и 48 секунд
и вообще.. в гугле полно инфы по подобной проблеме: http://www.google.ru/search?sourceid=chrom...mp;q=CLOSE_WAIT
неужели ничего не помогло?
PM WWW   Вверх
Олег2005
Дата 3.4.2011, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



На полученный от клиента сегмент 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'ами).
Думаю что и на виндах так надо делать - во всяком случае пробоватьь


Это сообщение отредактировал(а) Олег2005 - 3.4.2011, 20:01
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.