我试图推理一个用C实现的简单服务器如何用套接字处理并发客户端。假设一个简单的服务器等待客户端连接,然后读取从客户端发送的消息。read()是一个阻塞函数,所以服务器将阻塞,直到客户端写入它。如果我们假设两个客户端同时向服务器写入数据。服务器将唤醒其中一个,但另一个会发生什么?服务器在处理来自第一个客户端的请求时是否仍在“监听”?我知道bind函数接受一个int作为第二个参数,用来指定backlog(默认为5)。这是否意味着只有5个客户端可以同时连接到服务器?如果这是真的,那么处理多个并发连接的服务器是如何实现的呢?
3条答案
按热度按时间3b6akqbq1#
select(2)
和poll(2)
系统调用就是为了处理这种情况而发明的(使用non-blocking sockets
)。然后是
fork(2)
的多进程方法,当然,服务器可以用threads实现。最适合您的解决方案取决于您的具体要求。
ggazkfy82#
在服务器中使用此函数:
字符串
“backlog”表示一次可以尝试连接的未完成客户端的数量。
当此函数返回时:
型
然后立即将'sockfd'参数传递给
型
以使线程处理与客户端的通信。
注意:创建一个线程是昂贵和缓慢的,所以一开始应该创建一个线程池,并为每个客户端连接激活一个线程,当客户端断开连接时,将线程返回到线程池
nimxete23#
你应该线程。通常服务器有一个主线程来监听连接。如果建立了连接,主线程将创建另一个线程,并将该连接传递给新创建的线程。这样,在主线程仍然能够侦听新连接的同时处理连接。
**编辑:**这里是listen():
第一个月
对于给定的侦听套接字,内核维护两个队列: