如何在 C 中使用 FD_SET Unix 设置套接字文件描述符

问题描述 投票:0回答:1

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

fd_set fd_in;

现在我想为选择功能设置文件描述符:

FD_SET(socket_fd, &fd_in);

这是正确的方法吗?

然后我使用选择功能:

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

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

c sockets unix posix-select
1个回答
0
投票

可以在线获取相应的手册页,例如此处

尽管如此,您可能不清楚在将任何文件描述符添加到您的

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 设置代码。

© www.soinside.com 2019 - 2024. All rights reserved.