我是套接字编程的新手,我已经了解了select()
系统调用。我的问题是,假设我正在用C编写服务器(我正在尝试这样做),并且我希望在我的实现中使用select()
调用来练习。我正在尝试编写一个从客户端接收信息的服务器,因此我的方法是使用select()
,然后使用read()
并输出信息。
根据我阅读的文档select()
,返回输入集中准备用于i / o的文件描述符的 number 。我的问题是,如何知道原始集合中哪些文件描述符是为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? */
}
}
}
答案 0 :(得分:3)
可以使用属于FD_ISSET
的{{1}}宏来执行此操作。
当您的<sys/select.h>
解除阻塞和文件描述符准备就绪时,您可以在一个简单的循环中使用select
宏测试所有文件描述符。这可以转换为以下示例:
FD_ISSET
当然,这只是一个明显缺乏任何错误处理的示例,您应该在应用程序中处理。