c - 套接字文件说明

标签 c linux sockets

所以当有人向我展示一些使用 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 在 bind 和 listen 之后由于某种原因清除了以前的内容并将套接字文件描述符再次插入 fd set。同时,在 fd set 中,0 描述符(标准输入)显然消失了。

谁能解释一下这整件事?我觉得这不对,但我真的想不通。也许重新设置一些特定的 fd 集是一种实用的机制......

我认为 bind()listen() 可以以某种方式修改 fd 集。我设置了几个断点并检查了输出。因此,fd set 完全没有变化。

更新:

真正让我困惑的是第二个FD_ZERO(&readfds)。 显然第一个就像清除缓冲区中生锈的东西。在每次迭代中,我们必须将 fdset 清除为将来的默认值。我只是不明白第二个。要么是错误的,要么无论如何都不会造成伤害。

最佳答案

不确定您的困惑在哪里,但这里有一个解释。

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。将它作为读取 fdset 传递意味着如果您可以读取套接字或标准输入上显示了某些内容(例如您使用键盘),您将返回。

这在“聊天”应用程序的代码中可能很有用,因为它会等待您或您 friend 在另一端的输入。

你必须重新清零并重新设置 fdset 中的位的原因是因为 select本身会修改该集合以指示它检测到操作的 fd(或 fds)。

示例:如果有东西通过套接字输入而没有通过标准输入输入,则 fdset 将被修改为 select只设置该位。这样你就可以使用 FD_ISSET检测您应该查看哪些 fds。


如果,正如您在评论中指出的那样,没有 select两个 readfds 之间的调用(或使用 FD_ZERO()/FD_SET() 的其他调用)那么序列,是的,看起来第一个是不必要的,因为信息将被第二个覆盖。

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

关于c - 套接字文件说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406567/

相关文章:

这会导致段错误消息吗?

c - 使用 %f 打印 double 变量,终端显示 "?"

linux - 具有安装前和安装后操作的 Bitbake 配方

c - Mongodb-c-driver 工作后出现段错误

javascript - 将简单的温度 bash 脚本转换为 javascript

linux - Linux下读取带有特定VLAN标签的802.1Q帧

c - 删除字符串中的元音。我究竟做错了什么?

c - 释放哈希表的已分配内存时出现 "free(): invalid pointer"错误

c++ - 文件 I/O 与 TCP 套接字,同一机器内数据传输哪个更快?

python - 如何清空python中的套接字?