由于有多种方法可以将多客户端连接到服务器,例如:fork,select,threads等。如果您能描述将多个客户端连接到服务器哪个更好,我会很高兴吗?
答案 0 :(得分:6)
查看C10K页面,了解I / O框架和策略的完整概述和比较。
答案 1 :(得分:4)
设计一些心跳循环,它将遍历所有套接字并响应各自的事件。
我建议服务器是被动的(客户端将连接到它,而不是连接到客户端的服务器),因为它通常在Web上完成。因此,它也会有一个监听器套接字。
答案 2 :(得分:2)
一个简单的建议,避免使用fork,因为它创建了一个繁重的进程,使用更轻的线程,并共享与之创建的进程相同的内存空间。
答案 3 :(得分:2)
至少有两种选择。
或
如果你了解线程,第一种选择可能是更清洁的方法。第二种方法需要一些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一书是网络编程的最佳起点。