问题描述
- select 清空集合的问题
-
这里说每次轮询调用select函数都要FD_ZERO(&fds)清空集合,否则不能检测描述符变化。为什么?while(1)
{
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock,&fds); //添加描述符
FD_SET(fp,&fds); //同上
select(....)
}
解决方案
这个是socket编程里的同步选择机制select,我上学期刚好选修一门网络课程学了一些。
在select机制中,FDZERO(会变斜体,我就不加下横杠啦~)是非常重要的。其实fds不过是一个缓冲区,用来记录哪些套接字上发生了可读/可写/异常行为。
如果不清零,那么下一次检测时,会发现可读/可写行为等仍然存于套接字上,但实际上套接字并没有收到数据或者准备好写入数据啊~
这个跟运营商流量清零是一样的道理:新的月份开始,我要重新计费。
时间: 2024-12-30 00:05:38