重载你的OnConnect事件,收到该事件后,
1.判断是否nErrorCode == 0

解决方案 »

  1.   

        time(&t1);
        while((ret =connect(sd, (struct sockaddr *)&addr, sizeof(addr))) !=0)
        {
          time(&t2);
          if((t2 -t1) > timeout)
          {
            closesocket(sd);
            return -1;
          }
          peek_message();
          int err_no =WSAGetLastError();
      if(ret ==SOCKET_ERROR)
      {
      if(err_no ==WSAEISCONN) break;
      }
      else if(err_no ==WSAEWOULDBLOCK /*|| err_no ==WSAEINPROGRESS*/ || err_no ==WSAEALREADY)
      {
                 continue;
      }
              else
      {
    closesocket(sd);
        return -1;
      }
    }最好不要用ioctlsocket,不如unix下的ioctl好用。最好使用select函数。
    可以去www.programsalon.com下载例子。查找tcp或socket即可
      

  2.   

    在WINDOWS下面可以采用消息驱动的方式来实现,使自已的程序在ACCEPT和RECV时不至于被挂起。
    步骤:
    1:定义一个自已的消息:#DEFINE UM_SOCK  WM_USER+0x100
    2:定义自已的消息函数:如果是用的MFC的话,可以将消息函数定义为框架类的成员函数
    CMainFrame::OnMeg(WPARAM wParam,LPARAM lParam){.....}
    此函数可用来处理多种情况,可以是某个SOCKET上有连接请求,或者某个SOCKET上有数据可以接收,这要看第三步
    3。在完成SERVER端的初始化后,即在执行了LISTEN后,先不要调 用ACCEPT,而是提交一个事件,即提交一个连接事件,当有连接请求时,由系统产生一个UM_SOCK消息。
    这可以用这个函数:
    WSAAsyncSelect(m_sock,hWnd,UM_SOCK,FD_ACCEPT)
    其中最后一个参数可以用来提交不同的事件,本例中是连接事件,也可以是FD_READ或FD_WRITE,那么在消息函数中就要分清是什么事件产生的消息
    用这种机制实现讯后,应用程序可以不用等在ACCEPT或RECV上面,只有当有相应的事件发生时,才会调 用ACCEPT或RECV
      

  3.   

    hello008同志,本人只有区区21分可送,全部献上,礼轻情谊重,多谢了