【问题标题】:How to set Socket File Descriptor with FD_SET Unix in C / C++如何在 C/C++ 中使用 FD_SET Unix 设置套接字文件描述符
【发布时间】:2020-10-31 15:07:59
【问题描述】:

我目前正在从事一个套接字编程项目。 假设:

fd_set fd_in;

现在我想为选择函数设置文件描述符:

FD_SET(socket_fd, &fd_in);

这样对吗?

然后我使用选择功能:

int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

做了一些研究,我还没有继续。

感谢您的支持, 布鲁克斯的问候

【问题讨论】:

  • 您是否至少尝试过您的建议?成功了吗?
  • @LuisColorado 嘿,是的,我做到了,但我仍然面临问题 ;(。也许这只是因为其他一些功能

标签: c++ c sockets unix select


【解决方案1】:

相应的手册页可在线获得,例如here

尽管如此,您可能不清楚在将任何文件描述符添加到您的 fd_set 之前,您应该先清除它:

FD_ZERO(&fd_in);

那么,是的,您使用FD_SET(),就像您在问题中提出的那样:

FD_SET(socket_fd, &fd_in);

假设socket_fd 的值是一个打开的文件描述符。

这样做之后,使用指向结果 fd_set 的指针作为 select() 的参数之一是合理的,就像您展示的那样:

int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

请注意

  • 该特定调用仅对指定的文件描述符感兴趣,该文件描述符可用于读取(或者如果它是侦听套接字,则用于接受连接),而不是用于写入或异常情况。

  • 您必须检查select() 的返回值并根据结果采取适当的措施。由于您只使用单个 fd_set 和单个元素,没有超时,您应该期望 select 返回 1(当文件描述符准备好时)或 -1(出错时)。

  • 一般来说,每次调用select时都需要设置fd_set(s)。除非在某些特殊情况下,select() 返回后的集合内容通常与调用之前的内容不同,如果select 报告错误,那么您之后就根本无法依赖它们的任何内容.因此,在循环调用select()时,很常见,一般需要在同一个循环中有fd_set设置代码。

【讨论】:

  • 谢谢,非常感谢您的精彩教程;)
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2012-04-13
  • 2015-05-09
相关资源
最近更新 更多