Re[3]: Не срабатывает событие FD_CONNECT
От: TarasCo  
Дата: 14.12.05 09:07
Оценка:
Здравствуйте, stream15, Вы писали:

S>Здравствуйте, butcher, Вы писали:


B>>Здравствуйте, stream15, Вы писали:


S>>>В приведенном ниже коде событие hConnectedEvt никогда

S>>>не устанавливается и WSAWaitForMultipleEvents(...) всегда

B>>Приведите полный код, возможно тогда станет ясно..


S>Ниже я привожу полный код, но ситуация поменялась

S>на противоположную, которая ничуть не лучше.
S>Вышеописанный вариант мне воспроизвести не удалось.
S>У меня установлен firewall, может он как — то
S>вмешивался, хотя я его отключал, может не всегда...
S>Установлен так же локальный IIS, но я его
S>на всякий случай остановил.

S>1. Компьютер не подключен ни к сети ни к Inet.

S> Я указываю локальный IP адрес и порт, который
S> никто не прослушивает. При этом
S> DWORD dwRes = WSAWaitForMultipleEvents(1, &hConnectedEvt, FALSE, 5000, FALSE);
S> пролетает, как будто hConnectedEvt взведен до входа в ожидание.
S> Если я запускаю локальный сервер, слушающий порт 1111, то
S> устанавливается соединение и WSAWaitForMultipleEvents(...)
S> уже "пролетает" на законных основаниях.
S> Вместо локального я могу указать любой адрес, ситуация не меняется.

S>2. Компьютер подключен к Inet. В этом случае если указан не

S> локальный произвольный адрес, WSAWaitForMultipleEvents(...)
S> завершается по тайм — ауту, как и положено.

S>3. Опять же, если вместо FD_CONNECT использовать FD_WRITE,

S> все работает как надо.

У Вас работает все правильно. Если сервер на порту 1111 не запущен, вы вызываете connect на локальной машине очень быстро вернут ошибку о недоступности данного сервиса. При этом событие FD_CONNECT установят. С помощью WSAEnumNetworkEvents можно было бы узнать о том, что событие взведено и код ошибки ( WSAECONNREFUSED веротяно ).

В Вашем коде присутствуют логические ошибки:
connect проверяется на ошибку, но не проверяется на причину ошибки. Ожидать установки события следует лишь в случае кода WSAEWOULDBLOCK.
после установки события следует проверять причину его установки ( см. WSAEnumNetworkEvents ).

И уберите Вы эти WSASetLastError(0)
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.