c++ 为什么要使用非阻塞或阻塞套接字?

首先,我必须问,哪个州是最好的?例如实时MMORPG服务器。如果我为每个客户端创建线程而不是使用非阻塞套接字,该怎么办?或者如果我使用一个包含所有非阻塞套接字的线程怎么办?你能解释一下我的优势吗?
最佳答案
你的问题值得讨论一个更长的时间,但这里有一个短暂的答案:

>使用阻塞套接字意味着在任何一个线程中任何时候只有一个套接字可能是活动的(因为它在等待活动时阻塞)
>使用阻塞套接字通常比非阻塞套接字容易(异步编程往往更复杂)
>你可以创建1个线程每个套接字,如你所说,但线程有开销 – 你将无法创建非常多的(通常任何超过10-20线程被认为是坏的做法)
>使用非阻塞套接字,您可以处理更大量的客户端:在单个进程中数百甚至数千个 – 但是代码变得更复杂

使用非阻塞套接字(在Windows上),您有几个选项:

>轮询
>基于事件
>重叠I / O

重叠的I / O将给你最好的性能(成千上万的套接字/进程),代价是最复杂的模型来理解和实现正确。

基本上归结于性能与编程复杂性。

注意

这里有一个更好的解释为什么使用线程/套接字模型是一个坏主意:

在Windows中,创建大量线程的效率非常低,因为调度程序无法正确确定哪些线程应该接收处理器时间,哪些不应该接收。这与每个线程的内存开销相结合意味着在操作系统级别你将耗尽内存(因为堆栈空间)和处理器周期(因为管理线程的开销),否则你将耗尽容量来处理套接字连接。所以,是的,你可能能够生成一个进程,可以处理可能达到100或甚至更多的客户端这种方式,但它永远不会有效或能够处理数千连接。

转载注明原文:c++ 为什么要使用非阻塞或阻塞套接字? - 代码日志