Здравствуйте, Diablo_II, Вы писали:
D_I>Как чётко отделить локальное закрытие сокета (я сам его закрыл в другом потоке) от удалённого закрытия сокета (клиент вызвал closesocket).
Никогда не задавался таким вопросом. Что это у тебя за реализация сервера, если ты сам не знаешь, что закрыл сокет?
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 возвращаться.
Все логично. Соединение установлено успешно (AcceptEx отработал без ошибок) и затем EOF на WSARecv.
D_I>но что странно — взял netcat.exe (всем не безизвестный) D_I>- В сервере висит запрос AcceptEx запрос с ожиданием данных. D_I>- netcat'ом устанавливаем соединенеие и рвём его не отправляя данных. D_I>- AcceptEx сваливается на IOCP c кодом ERROR_NETNAME_DELETED. D_I>Откуда такая разница в поведении? Вроде оба делают судя по коду closesocket?
Посмотри снифером, какие пакеты отсылает твой клиент, и какие — netcat.
D_I>На сколько я понял ошибки типа WSAECONNABORTED, WSAENOTSOCK, WSAECONNRESET и пр. WSAxxx возвращаются только при немосредственном вызове WSARecv и пр функций. D_I>Т.е. они никогда (я такого не разу не видел) на возвращаются как ошибки при завершении операции через IOCP. D_I>При завершении опрации через IOCP вываливаются другие коды типа ERROR_NETNAME_DELETED, ERROR_OPERATION_ABORTED и пр.
Возможно. Именно поэтому и не рекомендуется привязываться к определенным кодам ошибок.