【发布时间】:2012-01-15 19:20:51
【问题描述】:
如Beej's Guide to network Programming 中所述,select() 监视一组用于读取的文件描述符(使用recv()),一组用于写入的文件描述符(使用send())和最后一个,我不知道。当服务器套接字接收到来自客户端套接字的消息时,read_fds set 将被修改,select() 从阻塞状态返回。向客户端套接字发送消息也是如此。例如:
for(;;) {
read_fds = master; // copy it
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);
}
//the rest is code for processing ready socket
我猜read_fds 集合此时将包含唯一的就绪套接字描述符(其他已删除),就绪套接字描述符是新连接的套接字或从连接的套接字发送的消息。我的理解正确吗?
看来ready socket必须一个一个处理。当我试图在 gdb 上运行它以了解行为时,当程序正在处理就绪套接字(select() 返回之后的代码)时,我尝试发送一些消息并通过一些新客户端连接到服务器。即使没有调用select(),它如何识别新客户端或新发送的消息?
【问题讨论】:
-
"即使 select() 没有被调用" - 你为什么不调用它呢?你的意思是什么?
-
@yi_H 我的意思是,在 GDB 中单步执行代码时,未调用 select() 行,但我发送消息或尝试将新客户端连接到调试服务器,检查代码不在 select() 行上。
-
您是否将监听套接字添加到 read_fds 中?
-
@yi_H 我确实做到了。我只是按照 Beej 的例子。