我期望的功能是: 用一个单线程的程序 完成多个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 ,这是为什么?请高手指点!
而下次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 ,这是为什么?请高手指点!
惭愧,原来是一个低级错误。
感谢各位