[英]How to set Socket File Descriptor with FD_SET Unix in C / C++
我目前正在从事套接字编程项目。 让我们假设:
fd_set fd_in;
现在我想为 select function 设置文件描述符:
FD_SET(socket_fd, &fd_in);
那是正确的方法吗?
然后我使用 select function:
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()
的 arguments 之一是合理的,再次如您所见:
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 设置代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.