vc socket编程中,重叠I/O模型是怎么同时与多个客户端交互,然后各socket之间又是互不影响的

vc socket编程中,重叠I/O模型是如何同时与多个客户端交互,然后各socket之间又是互不影响的?
我在书上看到的所谓的重叠I/O模型就是在WSARecv之后,调用WSAWaitForMultipleEvents等待事件信号,当recv得到数据即事件有信号了,接下来可以操作数据,这个效率比select高很多么?WSAWaitForMultipleEvents的意义也不大,WaitForSingleObject就行了,因为如果一个socket的操作很费时的话,while循环就会停住一段时间,从而影响另一个socket的操作,同select,select中传入一个socket的集合意义也不大,一个socket的操作费时同样会影响另一个socket。



我看到的socket之间不会相互影响的基本都是accept一个socket就为这个socket开一个线程,这样看起来似乎不好,但网络普遍都是这种代码。有没有一种方法不需要为每个连接的socket开线程(可以开线程,但要有上限,但不影响大量的socket连接),同时又能让socket之间的操作互不影响呢?
或者我理解的重叠I/O模型有错的话,真正的重叠I/O模型怎么是实现同时同多个客户端交互,但相互之间又互不影响呢?

我也看过完成端口和完成例程的原理,但我不知道怎么让耗时操作和非耗时操作分离,如果我只开4个线程,那么有5个人同时在下载服务器上一个较大的文件,那么不是总有一个人要等么?如果我的理解不对,请高手详细说明下。


有没有在大型网站或者大型交互式软件或者网游之类公司工作过的大牛?
告诉我,现实情况下,socket服务器究竟怎么样设计,性能才能最高?

------解决方案--------------------
为什么过时 他死活不说。。
------解决方案--------------------
楼主太多概念没搞清楚,我只能大概说一下,具体还要你自己努力。
选择模型是轮询的,它只能得到哪个套接字可读可写,具体还要你去recv和send
异步IO(比如你这里的重叠IO)不考虑套接字的可读可写性,直接WSARecv和WSASend,然后等待操作结束,等待应该是在线程中,等待不耗资源,那么其它线程就可以从容的做其它的事(有资源)。
比如你要发送1M的数据,select模型你要不停的select,不停的写,直接写完,异步IO一次WSASend投递就结束了(一般来说),直接等结果就行了。

网络编程中,不要涉及业务逻辑,收到数据直接扔缓存,业务线程再从缓存里取,网络编程中,只有数据的读写(更专业一点就是内核与用户之间的数据拷贝)以及加解一些锁(队列操作)。所以你所谓的耗时操作是不存在的。

一个套接字一个线程这种往往出现在例程中,这样简单(其中所使用的套接字往往是阻塞的,开线程以免影响其它套接字操作,否则需要用非阻塞,编程就麻烦了),实际应用中不可能是这样的。

在一个套接字上,只投递1个读和0个或者1个写,就做到了各个套接字互不影响了。
注意,大型服务端的任务是:保证各个客户端不是太慢的得到服务,而不是快速的服务某一个客户端,一定要有这个概念。一定要防止某些客户端饥饿。