首先,我必须问一下,在哪些情况下是最好的?比如实时MMORPG服务器。如果我为每个客户端创建一个线程而不是使用非阻塞套接字会怎样?或者如果我使用一个包含所有非阻塞套接字的线程会怎样?您能解释一下它们的优点吗?
您的问题值得更长的讨论,但这里是一个简短的回答:
在 Windows 上使用非阻塞套接字有几种选项:
重叠 I/O 将为您提供最佳性能(每个进程数千个套接字),但代价是最难理解和正确实现的模型。
基本上,这归结为性能与编程复杂性之间的折衷。
注意
以下是为什么使用线程/套接字模型是一个坏主意的更好的解释:
在 Windows 上,创建大量线程效率非常低,因为调度程序无法正确确定哪些线程应该接收处理器时间,哪些不应该。加上每个线程的内存开销,这意味着,在OS级别,您将在运行出处理套接字连接的能力之前就耗尽内存(因为堆栈空间)和处理器周期(因为管理线程的开销)。
recv()
的手册说,如果没有消息可用,它将在阻塞套接字上阻塞。我认为您只需要在接收之前使用 select()
或 poll()
,就不必担心本文提到的任何问题了。 - Błażej Michalik