如何在C/C++中用FD_set Unix设置套接字文件描述符



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

fd_set fd_in;

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

FD_SET(socket_fd, &fd_in);

这是正确的方式吗?

然后我使用选择功能:

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

做了一些研究后,我没能继续下去。

感谢您的支持,问候,来自Brooks

在线提供适当的手册页面,例如此处。

尽管如此,您可能不清楚,在向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。除了在某些特殊情况下,select()返回后的集合的内容通常与调用前不同,如果select报告错误,则之后您根本无法依赖它们的任何内容。因此,当在循环中调用select()时(这是常见的(,通常需要在同一循环中有fd_set设置代码。

最新更新