Здравствуйте, 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 то хоть можно полижиться?