首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字文件描述

套接字文件描述
EN

Stack Overflow用户
提问于 2012-02-23 03:04:48
回答 3查看 216关注 0票数 1

因此,当有人向我展示了一些使用select()的代码时,我完全失去了信心,比如:

代码语言:javascript
复制
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清除为将来的默认设置。我只是不明白第二个。要么是错的,要么无论如何都不会疼。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 03:15:16

不知道你的困惑在哪里,但这是一个解释。

fdset是从零索引的文件描述符的位掩码(从技术上讲,我不认为它必须是位掩码,但任何其他实现都是.奇怪)。

因此,fdset可能是这样的:

代码语言:javascript
复制
              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()覆盖。

如果没有看到完整的代码或架构设计文档:-),就很难说了。

票数 4
EN

Stack Overflow用户

发布于 2012-02-23 03:16:41

当您试图同时侦听多个套接字时,会使用Select()。每次您‘accept()’一个套接字连接时,都会返回一个套接字描述符,并使用它发送/接收文件。

在执行FD_SET时,可以向集合中添加一个套接字描述符(可以是读/写)。FD_ZERO清除该特定集合中的所有条目。

因此,从本质上说,每次您接受连接时,都可以将套接字描述符添加到集合中(也就是说,如果您想使用该套接字来读/写)。

调用select()函数时,可以指定要使用的集合。(例如: readfds)和select()投票所有已在该集合中的套接字(readfds)。

如需更多澄清,请阅读beej网络编程指南。这是一个很好的教程学习。

票数 1
EN

Stack Overflow用户

发布于 2012-02-23 03:19:30

select(2)修改它的参数fd集,因此您应该在每次迭代时重新初始化它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9406567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档