对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

时间:2013-02-01 16:51:53

标签: c++ c linux sockets client-server

该程序是在Linux上使用C开发的客户端服务器套接字应用程序。每个客户端都连接一个远程服务器,并将自己记录为在线。在任何给定的时间点,很可能会有几个客户在线,所有客户都试图连接到服务器以将自己记录为在线/忙/空闲等。那么服务器如何处理这些并发请求。什么是好的设计方法(每个连接请求的分叉/多线程可能?)?

5 个答案:

答案 0 :(得分:3)

我个人会使用事件驱动的方法来处理服务器。在那里你注册一个连接到达后立即调用的回调。只要套接字准备好读或写,就会发生事件回调。

与线程相比,拥有大量连接,您将获得出色的性能和资源优势。但我也会优先考虑更多关联。

如果你真的需要使用多个内核,或者如果你有一些请求可能需要更长时间来处理,而且在没有线程的情况下处理它太复杂,我只会使用线程。

我使用libev作为基础库来处理事件驱动的网络。

答案 1 :(得分:1)

一般来说,您希望线程池为请求提供服务。

典型的结构将从单个线程开始,除了排队传入的请求之外什么都不做。由于它没有做太多,一个线程通常很容易跟上网络的最大速度。

将项目放入某种并发队列中。然后你有一个其他线程池从队列中读取项目,执行所需的操作,然后将结果存放到另一个队列中(并重复,并重复直到服务器关闭)。

最后,你有另一个单独的线程,它只从结果队列中获取项目,并将回复发送给客户端。

答案 2 :(得分:0)

最佳方法是事件驱动模型与多线程模型的结合。

您创建了一堆非阻塞套接字,但线程计数应该少得多。即每个螺纹10个插座。

然后,您只需在非阻塞模式下的每个线程上侦听事件(传入请求),并在发生时对其进行处理。

此技术通常比非阻塞套接字或多线程模型分别执行得更好。

答案 3 :(得分:0)

看看Comer的“使用TCP / IP进行网络互连”第3卷(BSD套接字版本),它提供了编写服务器和客户端的不同方法的详细示例。完整的代码(没有解释,不幸的是)在网上。或者在http://tldp.org中翻找,你会找到一系列教程。

答案 4 :(得分:0)

选择或投票或epoll

这些是* nix系统上的工具,用于将多个事件源(连接)聚合到一个等待点。服务器将连接添加到数据结构,然后通过调用select等等等。当任何这些连接发生任何事情时,它会被唤醒,找出哪一个,处理它,然后再回到睡眠状态。有关详细信息,请参见手册。

在这些机制之上构建了几个更高级别的库,这使得编程更容易,例如libevent,libev等。