Здравствуйте, 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 ).