Re[5]: IOCP + сокеты - давайте докопаемся до истины.
От: Michael Chelnokov Украина  
Дата: 24.12.09 21:20
Оценка:
Здравствуйте, 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 и пр.

Возможно. Именно поэтому и не рекомендуется привязываться к определенным кодам ошибок.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.