将多个客户端连接到服务器的好方法是什么?

时间:2009-12-24 13:43:41

标签: c++ c networking sockets network-programming

由于有多种方法可以将多客户端连接到服务器,例如:fork,select,threads等。如果您能描述将多个客户端连接到服务器哪个更好,我会很高兴吗?

8 个答案:

答案 0 :(得分:6)

查看C10K页面,了解I / O框架和策略的完整概述和比较。

答案 1 :(得分:4)

设计一些心跳循环,它将遍历所有套接字并响应各自的事件。

我建议服务器是被动的(客户端将连接到它,而不是连接到客户端的服务器),因为它通常在Web上完成。因此,它也会有一个监听器套接字。

答案 2 :(得分:2)

一个简单的建议,避免使用fork,因为它创建了一个繁重的进程,使用更轻的线程,并共享与之创建的进程相同的内存空间。

答案 3 :(得分:2)

至少有两种选择。

  • 创建一个侦听套接字。
  • 等待连接。
  • 产生一个线程来处理连接。

  • 创建一个侦听套接字并使用select()等待它。
  • 如果侦听套接字fd变为活动状态,请建立新连接并将新fd添加到选择呼叫。
  • 如果连接fd变为活动状态,请处理它。

如果你了解线程,第一种选择可能是更清洁的方法。第二种方法需要一些fd管理(例如监听或连接),但可以在一个线程中完成。

what do you mean by this <<the first alternative might be a cleaner approach>>? can you explain pls?

如果你了解线程之间的线程和同步,第一种方法可以更简单,因为你可以使用普通的阻塞读写连接套接字。

如果您希望能够同时处理所有客户端,则第二种方法要求您使用非阻塞读/写并处理部分数据包。

答案 4 :(得分:1)

我在C中知道fd_select提供了这种套接字能力的轮询。不确定,但我猜测C#有更好的方法。

答案 5 :(得分:1)

如果您的程序在Windows上运行。完全避免线程和进程,并使用套接字编程的异步模型。到目前为止,这是进行网络通信的最有效(也是最简单的方法)。

答案 6 :(得分:1)

如果您正在使用Windows,那么处理大量客户端的最有效方法是围绕异步I / O和I / O完成端口构建您的服务器。这些允许您以有效的方式为少量(4?)线程的客户提供服务(10‰)。

有些人发现I / O完成端口模型的异步性质有点难以理解,但我有一个免费的C ++源代码框架,您可以从here下载以开始使用。如果您正在使用托管代码,那么.Net框架中的所有异步套接字API都会使用I / O完成端口。

I / O完成端口模型可以很好地扩展,因为它是一个从头开始构建的操作系统原语,效率很高;它知道与之关联的线程是否正在运行或等待,因此可以管理它允许同时处理“完成”的线程数。它还以fifo顺序使用线程,这样如果没有什么工作要做,那么浪费的上下文切换就会减少,因为只会使用最少数量的线程(而不是在所有线程中调度工作项并导致所有堆栈保持分页到内存中)。相比之下,您自己的线程池必须效率较低,因为您没有与IOCP相同的线程知识水平。选择通常会受到它可以支持的套接字数量的限制,这意味着为了实现真正的可扩展性,您需要在select之上构建一些复杂的代码,以便能够管理超过此数量的客户端。使用每个连接模型的线程效率要低得多,因为不仅新的线程会定期启动和停止,而且您在任何时候都无法控制进程中的线程数 - 当您考虑因素时线程是相对较重的资源一旦你有比CPU内核更多的线程,你就会在上下文切换中浪费时间(IOCP通常会完全避免)。最后,为每个连接分配一个新进程比每个连接模型的线程更重,并且我个人认为没有理由认为这是现代操作系统上的有效选项。

答案 7 :(得分:0)

Unix Network Programming的第30章介绍了客户端/服务器设计的替代方案。 UNP一书是网络编程的最佳起点。