我目前正在进行一个套接字编程项目。假设:
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设置代码。