一个socket异步链接的有关问题,就指教

一个socket异步链接的问题,就指教!
我服务端
C/C++ code

BOOL CServer::InitAndListen(HWND hwnd,UINT port){

    m_uPort=port;
    m_hWnd=hwnd;

    if(m_hSocket!=NULL)
    {
        //如果已经创建了套接字,就要先关闭原来的
        closesocket(m_hSocket);
        m_hSocket=NULL;
    }

    if(m_hSocket==NULL)
    {
        //创建新的套接字,这里创建的是流类型的套接字
        m_hSocket=socket(AF_INET,SOCK_STREAM,0);
        ASSERT(m_hSocket!=NULL);
        ServerInit();
    }

    m_addr.sin_family=AF_INET;
    m_addr.sin_addr.S_un.S_addr=INADDR_ANY;
    m_addr.sin_port=htons(m_uPort);

    int ret=0;
    int error=0;

    //判定一个套接字到本机的地址
    ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));

    if(ret==SOCKET_ERROR)
    {
        //判定错误
        AfxMessageBox("binding error!");
        return FALSE;
    }

    //开始一个监听过程,等待客户的链接
    ret=listen(m_hSocket,5);//第二个参数表示最多支持的客户连接数
    if(ret==SOCKET_ERROR)
    {
        AfxMessageBox("listen error!");
        return FALSE;
    }
    return TRUE;
}



已经开始监听了

客户端链接的代码
C/C++ code

BOOL CClient::InitAndConnect(HWND hwnd,UINT port,CString strserver){

    m_hWnd=hwnd;
    m_uPort=port;
    m_strServer=strserver;
    unsigned long ul;

    if(m_hSocket!=NULL)
    {
        //如果原来打开这个套接字,则先关闭
        closesocket(m_hSocket);
        m_hSocket=NULL;
    }

    if(m_hSocket==NULL)
    {
        //创建新的流套接字
        m_hSocket=socket(AF_INET,SOCK_STREAM,0);
        ASSERT(m_hSocket!=NULL);
        ClientInit();
    }


    //准备服务器的信息,这里需要指定服务器的地址
    m_addr.sin_family=AF_INET;
    m_addr.sin_addr.S_un.S_addr=inet_addr(m_strServer.GetBuffer(0));
    m_addr.sin_port=ntohs(m_uPort);

    //这里主动链接服务器,该过程将要等待一定时间
    int ret=0;
    int error=0;

    ret=connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));
    if(ret==SOCKET_ERROR)
    {
        CString m_CharWords;
        LPVOID lpMsgBuf;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL);
        m_CharWords=(char *)lpMsgBuf;
        LocalFree( lpMsgBuf );
        //连接失败
        if(GetLastError()!=WSAEWOULDBLOCK)
        {
            AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));
            return FALSE;
        }
    }
    return TRUE;
}



为什么总是在connect的时候出错 返回值为-1 我看了下 错误信息 说的是
无法立即完成一个非阻止性套接字操作
什么原因
求高手指教!!!

------解决方案--------------------
服务端还希accept操作,进行客户端连接
------解决方案--------------------
是IO_PENDING么? 是的话,就是说明你的套接字是非阻塞的,那么这个错误是正常的。
你需要继续监听这个套接字的可写事件,这时它才算真正连接成功了。
------解决方案--------------------
你的服务器有accept操作吗?
------解决方案--------------------
因为你用的是Windows底层的套接字编程方式,所以使用套接字之前应该要初始化ws2_32.dll,其实你在bind时就应该已经出错了.

你可在使用套接字的前面加入下面的代码:
WORD wVersionRequested;
int err;
WSADATA wsaData;

wVersionRequested = MAKEWORD( 2, 0 );
  err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
/* Tell the user that we couldn't find a usable */
/* WinSock DLL. */
return -1;
}

------解决方案--------------------
刚才指的是在服务器端加代码
------解决方案--------------------
你connect的时候,服务器端由accept的调用吗?

------解决方案--------------------
楼上两位说的对啊,缺少了accept了!