Re[3]: WSACleanup блокируется ???
От: Аноним  
Дата: 17.09.04 07:10
Оценка: +1
Здравствуйте, pankov, Вы писали:


P>Наблюдается следующая картинка :


P>я вызвал shutdown и closesocket для всех сокетов, но иногда потоки в которых проходят прослушивание, чтение и запись не завершаются. А завершаться они должны по принципу : возвратилась ошибка, выйти из потока. Видимо не всегда происходят выходы. Забыл я еще упомянуть о факте работы rpc в сервере. Возможно rpc как то влияет и блокирует WSACleanup. Старый добрый MSDN не содержит к сожалению решений подобных ситуаций...


P>Может прибиение rpc как то блокирует сокеты приложения ??? Но почему первый WSACleanup проходит хорошо (он кстати пока не выгружает ws2_32.dll, а только лишь декремент выполняет), а второй блокируется (вот этот и выполняет выгрузку ws2_32.dll). Стоит отметить, что ранее я прибивал потоки через TerminateThread, но потом следуя рекомендации Дж.Рихтера сделал выход из потока внутри через rerurn. Раньше это все работало без rpc. Но пришла беда на нашу землю и .... о чем это я ?


скорее всего ошибка где-то у Вас в приложении

по shutdown() и closesocket() должны вывалится все блокирующие send() и recv()
по closesocket() должны вывалится все блокирующие accept()
дождитесь завершения рабочих потоков WaitForSingleObject() WaitForMultipleObjects()
потом уже закрывайте winsock, лучше это делать не в каждом объекте, все-таки,
хотя если объект статический и живет все время работы программы, то можно.

кстати говоря, не всегда, к примеру, recv() вернет ошибку, может вернуть и EOF
(т.е. return не SOCKET_ERROR а 0 — тоже значит партнер закрылся)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.