C中的客户端服务器多个连接

Client Server multiple connections in C

我正在尝试推理用 C 语言实现的带有套接字的简单服务器如何处理并发客户端。假设一个简单的服务器等待客户端连接,然后读取客户端发送的消息。 read() 是一个阻塞函数,因此服务器将阻塞直到客户端写入它。如果我们假设两个客户端同时写入服务器。服务器将唤醒其中一个,但另一个会发生什么?服务器在处理来自第一个客户端的请求时是否仍然"listening"?我知道 bind 函数将一个 int 作为指定积压(默认为 5)的第二个参数。这是否意味着只有 5 个客户端可以同时连接到服务器?如果那是真的,那么处理多个并发连接的服务器是如何实现的?

你应该线程。通常服务器有一个主线程来监听连接。如果建立连接,主线程会创建另一个线程并将该连接传递给新创建的线程。这样,连接得到响应,同时主线程仍然能够侦听新连接。

编辑: 这是 listen():

listen(int socket_fd, int backlog)

对于给定的侦听套接字,内核维护两个队列。

  • 连接队列不完整,SYN 已到达,但三向握手 (TCP) 未完成。 (SYN_RCV 状态) 一个完整的连接队列
  • 三次握手完成。 (ESTABLISHED 状态)积压参数历史上指定两个队列的总和。但是对于积压意味着什么没有正式的定义。

select(2) and poll(2) system calls were invented to deal with this exact situation (with non-blocking sockets).

然后是fork(2), and then, of course, the server could be implemented with threads的多进程方法。

适合您案例的最佳解决方案取决于您的具体要求。

在服务器中使用此功能:

int listen(int sockfd, int backlog); 

'backlog' 表示有多少未完成的客户端可以同时尝试连接。

当这个函数 returns:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  

然后立即将 'sockfd' 参数传递给

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);  

让线程处理与客户端的通信。

注意:创建线程既昂贵又缓慢,因此应首先创建 'pool' 个线程并为每个客户端连接激活一个线程,当客户端断开连接时,return 线程到池