C语言中基于事件的socket编程
当select语句调用返回时,我们检查活动文件描述符以处理多个客户端的请求C语言中基于事件的socket编程,c,sockets,select,C,Sockets,Select,当select语句调用返回时,我们检查活动文件描述符以处理多个客户端的请求 select(maxfd+1, &readfds, NULL, NULL, NULL); 也就是说,select命令监视readfds集合中的文件描述符。我的问题是,当处理客户端请求时,更多的新连接到达侦听套接字,程序将如何捕获这些新连接 如果监视select()的readfd集合中的服务器套接字,您将了解到这一点。Select将服务器套接字指示为可读,这意味着有一个连接正在等待,因此您可以接受它 (请注意,操
select(maxfd+1, &readfds, NULL, NULL, NULL);
也就是说,select命令监视readfds集合中的文件描述符。我的问题是,当处理客户端请求时,更多的新连接到达侦听套接字,程序将如何捕获这些新连接 如果监视select()的readfd集合中的服务器套接字,您将了解到这一点。Select将服务器套接字指示为可读,这意味着有一个连接正在等待,因此您可以接受它
(请注意,操作系统会进行初始TCP握手并建立连接,accept()只会使连接对您的程序可用)您必须使用线程。在处理完当前连接之前,它不会这样做。当然,这是假设您只使用一个线程/进程。@Abhishek Sagar:您已经问了10个问题,但没有接受一个答案。如果答案解决了您的问题,请将其标记为已接受。@DanielKozar,这意味着,我应该使用线程来处理客户端请求,而主线程负责选择调用?那么,如果是这样的话,read_set将是main和另一个线程之间的共享变量,因此,需要使用互斥来正确运行程序吗?@nightcracker,好的,我会处理这个问题。
...
FD_SET(server_sock, &readfds);
select(maxfd + 1,&readfds,NULL,NULL,NULL);
if(FD_ISSET(server_sock, &readfds)) {
int new_client = accept(server_socket, ... );
//add the new client to descriptors to monitor, etc..