我创建了一个TCP端口,但在执行Connect时失败。调用WSAGetLastError(),返回的错误值是2。不知是什么原因?另外,在win2003 server中出现的几率比在2000中出现的几率小。奇怪。

解决方案 »

  1.   

    int             ConnectStatus;    // the return value of WSAConnect
        int             Error;            // gets error values

        struct sockaddr_in SockAddr;      // socket address for WSAConnect

        int             SockAddrLen;      // the length of the above

        m_EventSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

        if (m_EventSocket == INVALID_SOCKET)
        {
    return WSAGetLastError();
        }    unsigned long ul = 1;    Error = ioctlsocket(m_EventSocket, FIONBIO, (unsigned long *)&ul);
        if(SOCKET_ERROR == Error)
        {
    SAFE_CLOSESOCKET(m_EventSocket);
    return WSAGetLastError();
         }     // 禁用Nagle算法
         int nZero = 1;
         setsockopt(m_EventSocket, IPPROTO_TCP, TCP_NODELAY, 
          (char *)&nZero, sizeof(nZero));     // 保持活动
         setsockopt(m_EventSocket, SOL_SOCKET, SO_KEEPALIVE, 
    (char *)&nZero, sizeof(nZero));
         // 下面的hCP为完成端口句柄
         HANDLE hrc = CreateIoCompletionPort((HANDLE)m_EventSocket, hCP,                       1, 0);
    if(hrc == NULL)
    {
    SAFE_CLOSESOCKET(m_EventSocket);
    return GetLastError();
    }    SockAddr.sin_family = AF_INET;
        SockAddr.sin_port = wPort;
        SockAddr.sin_addr.s_addr = dwIP;
        SockAddrLen = sizeof(SockAddr); ConnectStatus = connect(m_EventSocket,
    (sockaddr *)&SockAddr,
    SockAddrLen);

        if (ConnectStatus == SOCKET_ERROR) 
       {
            Error = WSAGetLastError();
           if (Error != WSAEWOULDBLOCK) 

    // 错误WSAEWOULDBLOCK意味着连接稍后建立
    struct in_addr in;
    in.S_un.S_addr = m_dwLocalIP;
    //int nLen = sizeof(int);
    //getsockopt(m_EventSocket, SOL_SOCKET, SO_ERROR, (char *)&Error, &nLen);
    Error);
    SAFE_CLOSESOCKET(m_EventSocket);
    return Error;
        }
           }
      

  2.   

    int nZero = 1;
         setsockopt(m_EventSocket, IPPROTO_TCP, TCP_NODELAY, 
          (char *)&nZero, sizeof(nZero));还没用过这个东东,学习!
      

  3.   

    SockAddr.sin_port = wPort;
        SockAddr.sin_addr.s_addr = dwIP;这两个参数有没有转换成网络字节顺序??
      

  4.   

    msdn中对wsastartup的解释是:
    An application cannot call WSAGetLastError to determine the error code as is normally done in Windows Sockets is WSAStartup fails. The WS2_32.DLL will not have been loaded in the case of a failure so the client data area where the "last error" information is stored could not be established.
    你出现的那种错误码不是winsock的,它的错误码都是10000以上的,大概没有调用WSAStartup的缘故吧,所以你用WSAGetLastError 所获得的错误码不是winsock的