因此,当有人向我展示了一些使用select()的代码时,我完全失去了信心,比如:
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
FD_SET(0,&readfds);
.......// bind() and listen(),regular stuff
// Before select(),this guy cleared readfds to null and sort of start all over again
FD_ZERO(&readfds);// Behold,this is exactly the line confusing myself
FD_SET(socket,&readfds);
// select will be called in the future within a infinite loop 因此,从根本上说,绑定和侦听之后的FD_ZERO出于某种原因明确了以前的内容,并将套接字文件描述符插入到fd set again.Meanwhile中,在fd集合中,0描述符(标准输入)显然消失了。
有人能解释这整件事吗?我不觉得这是正确的,但我真的搞不懂。也许重新设置一些特定的fd集是一种实用的机制。
我认为bind()和listen()可以用某种方式修改fd集,我设置了几个断点,检查了outputs.Consequently,fd集一点也没有改变。
更新:
真正让我困惑的是第二个FD_ZERO(&readfds)。显然,第一种方法就像清除缓冲区中生锈的东西一样。在每次迭代中,我们必须将fdset清除为将来的默认设置。我只是不明白第二个。要么是错的,要么无论如何都不会疼。
发布于 2012-02-23 03:15:16
不知道你的困惑在哪里,但这是一个解释。
fdset是从零索引的文件描述符的位掩码(从技术上讲,我不认为它必须是位掩码,但任何其他实现都是.奇怪)。
因此,fdset可能是这样的:
Byte 0 Byte 1
+---+---+---+---+---+---+---+---+ +---+---+----+----+----+----+----+----+
|fd0|fd1|fd2|fd3|fd4|fd5|fd6|fd7| |fd8|fd9|fd10|fd11|fd12|fd13|fd14|fd15|
+---+---+---+---+---+---+---+---+ +---+---+----+----+----+----+----+----+这样做的想法是,如果您对给定的fd (文件描述符)感兴趣,可以为它设置位。如果你对此不感兴趣,那就把事情说清楚。
FD_ZERO将清除所有比特,这是一个很好的起点。然后,两个FD_SET调用将为fd0 (标准输入)和fd<socket>设置位。
然后,如果标准输入或套接字上有操作(操作类型将取决于将fdset传递给select时使用的参数位置),使用该fdset的select调用将返回。将其作为read传递意味着,如果您可以读取套接字,或者在标准输入(例如使用键盘)上显示了某种内容,您就会返回。
这在“聊天”应用程序的代码中可能很有用,因为它将等待您或您的朋友在另一端输入。
您必须对fdset中的位进行重新零和重新设置的原因是,select自己修改了该集合,以指示它检测到了什么fd (或fds)。
示例:如果有什么东西是通过套接字传入的,而没有通过标准输入的,那么select将修改fdset,使其只具有该位设置。这样,您就可以使用FD_ISSET来检测您应该查看的fds。
如果正如您在注释中所指出的,在两个select序列之间没有readfds调用(或其他使用readfds的调用),那么是的,第一个似乎是不必要的,因为信息将被第二个FD_ZERO()/FD_SET()覆盖。
如果没有看到完整的代码或架构设计文档:-),就很难说了。
发布于 2012-02-23 03:16:41
当您试图同时侦听多个套接字时,会使用Select()。每次您‘accept()’一个套接字连接时,都会返回一个套接字描述符,并使用它发送/接收文件。
在执行FD_SET时,可以向集合中添加一个套接字描述符(可以是读/写)。FD_ZERO清除该特定集合中的所有条目。
因此,从本质上说,每次您接受连接时,都可以将套接字描述符添加到集合中(也就是说,如果您想使用该套接字来读/写)。
调用select()函数时,可以指定要使用的集合。(例如: readfds)和select()投票所有已在该集合中的套接字(readfds)。
如需更多澄清,请阅读beej网络编程指南。这是一个很好的教程学习。
发布于 2012-02-23 03:19:30
select(2)修改它的参数fd集,因此您应该在每次迭代时重新初始化它们。
https://stackoverflow.com/questions/9406567
复制相似问题