Re[2]: Не срабатывает событие FD_CONNECT
От: stream15  
Дата: 14.12.05 08:01
Оценка:
Здравствуйте, butcher, Вы писали:

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


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

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

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


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

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

2. Компьютер подключен к Inet. В этом случае если указан не
локальный произвольный адрес, WSAWaitForMultipleEvents(...)
завершается по тайм — ауту, как и положено.

3. Опять же, если вместо FD_CONNECT использовать FD_WRITE,
все работает как надо.

Юрий


// ScaleCons.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <crtdbg.h>

#pragma comment (lib, "LIBCD.LIB")
#pragma comment (lib, "ws2_32.lib")

#define CR endl << endl

const int cSERVER_PORT = 1111;
const char cIP_ADDRESS[] = "127.0.0.1";
//#define cIP_ADDRESS "196.162.0.11"

int main(int argc, char* argv[])
{
using std::cin;
using std::cout;
using std::endl;
using std::cerr;

int nRes = 0;
WSADATA wd;
int nRet = 0;
if(nRet = WSAStartup(MAKEWORD(2,2), &wd))
{
cerr << "WSAStartup fail with code " << nRet << CR;

}

cout << "WSAStartup OK" << CR;

SOCKET sock_ = INVALID_SOCKET;
struct sockaddr_in peer;

ZeroMemory(&peer, sizeof(SOCKADDR_IN));

sock_ = socket(AF_INET, SOCK_STREAM, 0);
if (sock_ == INVALID_SOCKET)
{
cerr << "Cannot create Socket" << CR;
}

cout << "Socket CREATED" << CR;

WSAEVENT hConnectedEvt = WSA_INVALID_EVENT;
hConnectedEvt = WSACreateEvent();
nRes = WSAEventSelect (sock_, hConnectedEvt, FD_CONNECT);
_ASSERTE(!nRes);

peer.sin_family = AF_INET;
peer.sin_port = htons(cSERVER_PORT);
peer.sin_addr.s_addr = inet_addr(cIP_ADDRESS);

WSASetLastError(0);
int nResult = connect(sock_, (struct sockaddr *)&peer, sizeof(peer));
if (SOCKET_ERROR == nResult)
{
cout << "Connect result: " << WSAGetLastError() << CR;
}

else if (!nRes) cout << "Connection established" << CR;

WSASetLastError(0);
DWORD dwRes = WSAWaitForMultipleEvents(1, &hConnectedEvt, FALSE, 5000, FALSE);

cout << "WSAWait connect result: " << dwRes << "/" << WSAGetLastError() << CR;


shutdown(sock_, 2);
closesocket(sock_);
BOOL boRes = WSACloseEvent(hConnectedEvt);
_ASSERTE(boRes);

WSACleanup();

cout << "Press any key to exit..." << CR;

_getch();
return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.