我目前正在从事一个套接字编程项目。 我们假设:
fd_set fd_in;
现在我想为选择功能设置文件描述符:
FD_SET(socket_fd, &fd_in);
这是正确的方法吗?
然后我使用选择功能:
int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);
做了一些研究后,我还没有继续下去。
可以在线获取相应的手册页,例如此处。
尽管如此,您可能不清楚在将任何文件描述符添加到您的
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 设置代码。