Re[6]: IOCP + сокеты - давайте докопаемся до истины.
От: Diablo_II  
Дата: 25.12.09 05:19
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

D_I>>Как чётко отделить локальное закрытие сокета (я сам его закрыл в другом потоке) от удалённого закрытия сокета (клиент вызвал closesocket).

MC>Никогда не задавался таким вопросом. Что это у тебя за реализация сервера, если ты сам не знаешь, что закрыл сокет?
Ну тут хитрость была с том чтобы без дополнительных флажков и пр. приспособлений определить чьё это закрытие.
Так, например, если висит AcceptEx c ожиданием данных, то если клиент подключится и не присылая данных отключится — получим
AcceptExComplete на IOCP c кодом ERROR_SUCCESS и dwNumberBytes == 0
а если я сам закрою сокет через Disconnect, то плучим то же
AcceptExComplete на IOCP c кодом ERROR_SUCCESS и dwNumberBytes == 0.

В общем решение было изначально с флажком, но что-то оно мне не нравилось. думал как-то по другому устаканить.


D_I>>По поводу этого кстати заметил в ходе экспериментов следующие 2 ситуации.

D_I>>- В сервере висит запрос AcceptEx запрос с ожиданием данных.
D_I>>- Если мой клиент подключается и потом не посылая данных делает closesocket.
D_I>>- AcceptEx сваливается на IOCP c кодом ERROR_SUCCESS и dwNumberBytes == 0.
D_I>> причём самое смешное — на этот сокет — по факту уже не имеющий подключения можно сделать WSARecv — который отработает без ошибок.
D_I>> Правда для него всегда будет dwNumberBytes == 0 возвращаться.

MC>Все логично. Соединение установлено успешно (AcceptEx отработал без ошибок) и затем EOF на WSARecv.

Вот оно Блин, как-то не догадался рассматривать WSARecvComplete c dwNumberBytes = 0 как EOF.
Теперь всё логично. Спасибо за очевидную мысль.

D_I>>На сколько я понял ошибки типа WSAECONNABORTED, WSAENOTSOCK, WSAECONNRESET и пр. WSAxxx возвращаются только при непосредственном вызове WSARecv и пр функций.

D_I>>Т.е. они никогда (я такого не разу не видел) на возвращаются как ошибки при завершении операции через IOCP.
D_I>>При завершении опрации через IOCP вываливаются другие коды типа ERROR_NETNAME_DELETED, ERROR_OPERATION_ABORTED и пр.

MC>Возможно. Именно поэтому и не рекомендуется привязываться к определенным кодам ошибок.

ну на ERROR_SUCCESS то хоть можно полижиться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.