我期望的功能是: 用一个单线程的程序 完成多个non blocking的socket的数据发送和接收所有的具体的收包工作都放到  receiveMessage 来做,即在其他地方如果s要recv数据,只作FD_SET(s,&readfds)。
而下次select能检测到 s可读,然后把程序引导到receiveMessage。同样,所有的发包工作都放到  sendMessage 来做。
另外,在循环之前所有的 s 都是确定连接好的。
      通过网络抓包 s的连接方确实给s发了包过来。 
下面是我的代码结构:
for(;;){
  FD_ZERO(&readfds);
  FD_ZERO(&writefds);
  for(s 遍历 一个socket集){
      //根据情况 FD_SET(s,&readfds) 或 FD_SET(s,&writefds)
  }
  n = select(maxfd+1,&readfds,&writefds,0,&time);  
  for( s 遍历socket集 ){ 
    if(FD_ISSET(s,&readfds)){  //s 有数据可读 
      FD_CLR(s,&readfds);
  receiveMessage(s);
     //do something ...........   
    }   
    if(FD_ISSET(s,&writefds)){ //s 可以发送数据 
     FD_CLR(s,&writefds);
 sendMessage(s);
     //do something ........   
    }   
  }

在循环之前所有的 s 都是确定连接好的;
writefds能检测到,能发出信息;
而这段程序现在的问题是:虽然通过网络抓包 s的连接方确实给s发了包过来,
也做了FD_SET(s,&readfds),
但是FD_ISSET(s,&readfds) 每次都是0 ,这是为什么?请高手指点!

解决方案 »

  1.   

    使用select函数的时候,一定要检查返回值如果错误将返回SOCKET_ERROR;如果超时返回0;否则返回set中的数目估计你这里是出现了SOCKET_ERROR,或者你设置的超时时间太短了
      

  2.   

    先确定是否有数据发过来。调试一下执行到select函数时,查看各个参数结构中各个数据值是否正常。另外,可以把&writefds改成NULL看看是什么结果。
      

  3.   

    解决了,原因是我的socket集中混进了一个 错误的socket,select一直报10038的错误,
    惭愧,原来是一个低级错误。   
    感谢各位