我采用的是 non blocking模式,每次连接的时候都会print 10035,我尝试了如下方法 
1.重新连接也是还是 10035
2.改成阻塞模式实在是太慢
3.用select 好像只能处理 10036的情况不知道如何处理,请高手赐教!(最好有代码结构)以下是我的代码结构://链表的定义
Struct SockAddrList{
  sockaddr_in addr;
  SockAddrList* next;
};
//......
SockAddrList node = m_head;
SOCKET sk;
for( ;node; node=node->next){//个数在100个左右
  sk = socket(AF_INET,SOCK_STREAM,0);
  unsigned long val = 1;
  ioctl(sk,FIONBIO,&val);//设为non blocking
  r=connect(sk,(struct sockaddr*)&node->addr,sizeof(struct sockaddr));  if(r==-1)
  {  
   printf("error code: %d",GetLastError()==10035);
  }
  else
  {
    //send message
  }
}

解决方案 »

  1.   

       non   blocking模式,connect不会等到成功,而是马上返回。你需要再select()来判断成功与否。
       for (i = 0; i < TotalSockets; i++)         
                FD_SET(SocketArray[i]->Socket, &ReadSet);
       if ((Total = select(0, &ReadSet, NULL, NULL, NULL)) == SOCKET_ERROR)
          {
             printf("select() returned with error %d\n", WSAGetLastError());
             return;
          }
      

  2.   

    10035不是错误。改变为nonblock模式后第一个改变的观念就是:不能认为凡是遇到SOCKET_ERROR都认为遇到错误了。WSAEWOULDBLOCK是一种正常性的错误码,他告诉你现在这个操作无法完成,必须等待后续的通知。你可以通过楼上说的select方式去检查是否链接成功建立
      

  3.   

    WSAEINPROGRESS(10036)表示一个操作已经进行,但是还没有完成
    WSAEWOULDBLOCK(10035)表示一个操作会导致阻塞
    没有研究过第一个操作,不知道是不是在完成端口时遇到的:)
    后者只要一个网络操作无法立刻完成,就是这样
      

  4.   

    不过 selete 是同步的吧,需要等待么?
      

  5.   

    谢谢你们的回复还有两个疑问 
    1. select时 要不要 用循环即,只用一次select, SocketArray[i]中的socket是不是都能 连接好?   for (i = 0; i   < TotalSockets; i++)           
           FD_SET(SocketArray[i]->Socket, &ReadSet);  
       if ((Total = select(0, &ReadSet, NULL, NULL, NULL)) == SOCKET_ERROR)  
       {  
             for (i = 0; i   < TotalSockets; i++)  
                 if( FD_ISSET(SocketArray[i]->Socket),ReadSet) )
                    //......;  
       }2. select是同步的吗,他是有socket在 ReadSet里就返回,还是需要等待 直到设置的时间达到 后再返回 
      

  6.   

      1:select要在一个循环里面的.比如常用while循环
      2:需要等待,最后一个参数是个时间控制结构体,具体参考MSDN.