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