我对套接字编程不是很熟悉,最近被引入了`select()`系统调用。我的问题是,比如说我正在用C语言编写服务器(这正是我尝试做的),我想在实现中使用`select()`调用进行练习。我正在尝试编写一个从客户端接收信息的服务器,所以我的方法是使用`select()`,然后使用`read()`来输出信息。
根据我读到的文档,`select()`会返回输入集合中准备好进行i/o操作的文件描述符数量。我的问题是,怎么知道原始集合中哪个文件描述符已经准备好进行i/o操作?我似乎在搜索和查看了一段时间的示例后找不到答案。
假设我代码如下:
根据我读到的文档,`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? */
}
}
}
select
。 搜索"C10K问题"。 - Basile Starynkevitchselect
和select_tut
的手册页。 - Ulrich Eckhardt