gpt4 book ai didi

c - 在 C 中调用 select() 后知道哪些文件描述符准备就绪

转载 作者:行者123 更新时间:2023-12-05 01:26:08 25 4
gpt4 key购买 nike

我是套接字编程的新手,我已被介绍给 select()系统调用。我的问题是,假设我正在用 C 编写服务器(我正在尝试这样做)并且我想使用 select()调用我的实现进行实践。我正在尝试编写一个从客户端接收信息的服务器,所以我的方法是使用 select() ,其次是 read()并只输出信息。

根据我读过的文档select()返回输入集中准备好进行 I/O 的文件描述符的数量。我的问题是,如何知道原始集中的哪些文件描述符是准备用于 i/o 的文件描述符?我似乎无法在过去一段时间的搜索或示例中找到这个。

假设我的代码如下所示:

int main() {
/* Create socket/server variables */
int select_value;
int this_socket;
int maxfd;
struct sockadder_in address;
fd_set allset;

/* Bind the socket to a port */
main_socket = socket(AF_INET, SOCK_STREAM, 0);
if (main_socket < 0) {
perror("socket()");
exit(1);
}

Connect(main_socket, (struct sockaddr *)&address, sizeof(address));

/* Add the socket to the list of fds to be monitored */
FD_ZERO(&allset);
FD_SET(main_socket, &allset);

fd_set read_ready = allset;
fd_set write_ready = allset;

while (1) {
/* Listen for a connection */
/* Accept a connection */
select_value = Select(maxfd+1, &read_ready, &write_ready, NULL, NULL);
if (select_value == -1) {
perror("select()");
exit(1);
}
else if(select_value > 0) {
/* How to access i/o ready file descriptors
now that we know there are some available? */
}
}
}

最佳答案

可以使用 FD_ISSET 来做到这一点。宏是 <sys/select.h> 的一部分.

当您的 select解除阻塞并且文件描述符已准备好,您可以使用 FD_ISSET 测试所有文件描述符宏在一个简单的循环中。这可以转换为以下示例:

for (i = 0; i < FD_SETSIZE; ++i) {
if (FD_ISSET (i, &read_fd_set)) {
if (i == bound_socket) {
// A new client is waiting to be accepted
new = accept(sock, (struct sockaddr *) &clientname, &size);
// ...
FD_SET (new, &active_fd_set);
}
else {
// There is something to be read on the file descriptor.
data = read_from_client_on(i);
}
}
}

当然,这只是示例,显然缺少任何错误处理,您应该在应用程序中处理这些错误。

关于c - 在 C 中调用 select() 后知道哪些文件描述符准备就绪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22739224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com