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

Kee*_*eto 5 c sockets client-server server

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

Nik*_*sov 5

和系统调用就是为了处理这种具体情况而发明的(使用select(2))。poll(2)non-blocking sockets

然后就是多进程的方式fork(2),然后当然服务器也可以用线程来实现。

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


Ehs*_* Ab 2

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

编辑: 这是listen():

listen(int socket_fd, int backlog)

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

  • 已收到 SYN 但三向握手 (TCP) 尚未完成的不完整连接队列。(SYN_RCV状态)一个完整的连接队列。
  • 三方握手完成。(ESTABLISHED 状态)backlog 参数历史上指定两个队列的总和。但积压的含义并没有正式的定义。

  • 是的,您可以为每个连接使用一个线程。然后,当您同时拥有的客户端数量多于盒子中的核心数量时,就会到来。 (2认同)