Re[4]: "плохой" int connect
От: Evilguc  
Дата: 25.10.08 17:15
Оценка:
Здравствуйте, netch80, Вы писали:

N>>>Файрволл? Уберите.

E>>нет он здесь нипричем...

N>Я подозреваю, что вполне даже "причём" (на серверной стороне). Или же у вас на клиенте что-то относительно старое. Нормальная система без файрволла на коннект на незанятый никем порт тут же отдаст RST и будет облом connect() как только этот RST придёт. Старые винды (района 98 и ранней 2000, AFAIR) были известны тем, что игнорировали RST, потому что сами отдавали его в неуместных случаях (как переполнение слушающей очереди), но сейчас, мне казалось, это уже не актуально. Или актуально? Я бы советовал попробовать пообщаться с каким-нибудь вменяемым юниксом как сервером и посмотреть сниффером, что при этом происходит.

нет, с этим я то согласен, но как бы файервол не работал/не работал, все равно такая вот ерунда.


N>Я имел в виду как раз работу в неблокирующем режиме. Это в нём, если connect() не состоялся сразу (что возможно только на локальной машине) — возвращается [WSA]EINPROGRESS. В блокирующем, понятно, оно впадёт в ожидание, пока не сработает внутренний таймаут стека.


хмхм... я вот попробовал, но почему-то возвращает не WSAEINPROGRESS, а WSAEWOULDBLOCK. Конечно скорее всего это с моей стороны ошибка, может поможете:

    BOOL sMode = 1;
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    SOCKET sock;
    struct sockaddr_in addr;
    if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET)
    {
        addr.sin_family = AF_INET;
        addr.sin_port = htons(SERVER_PORT);
        addr.sin_addr.s_addr = inet_addr(ip);
        int result = ioctlsocket(sock, FIONBIO, (u_long*) &sMode);
        if (result != -1)
        {
               if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != SOCKET_ERROR)
               {
                           //выполняю обмен данными
               }
        }
        MessageBeep(MB_ICONHAND);
        return WSAGetLastError(); // здесь почему-то возвращается WSAEWOULDBLOCK
    }
    return 0;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.