繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM