select()返回0,但实际上是有数据过来的。
- C/C++ code
FD_ZERO(&recv_mask); FD_SET(sock, &recv_mask); timeout.tv_sec = time_out; //设置超时s timeout.tv_usec = 0; ret = select(sock+1, &recv_mask, NULL, NULL, &timeout);// 老是select 不到数据,其实是有数据过来了。 if (ret < 0) //出错 { printf("\nselect()<0: Error!\n"); return -1; //未知错误 } if (ret == 0) //如果超时,再读一次 { ret = select(sock+1, &recv_mask, NULL, NULL, &timeout); while(ret == 0) { ret = select(sock+1, &recv_mask, NULL, NULL, &timeout); } } else { 处理正确数据。 } [解决办法]
每次select前重新设置fdset,因为select会修改它。
[解决办法]
每次select返回后要重新把socket句柄设置到集合中,因为select修改描述符集合.select返回0应该是超时.
这里有使用select的程序源码,解压后找MsgSndSrv目录:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
建议你贴出完整接收、发送代码;你收不到数据多数情况下是服务端和客户端开的socket类型不匹配造成的