客户端(大概有100个)使用什么socket模型好

如题所述

第1个回答  2017-11-29
1、普通的阻塞和非阻塞编程。
利用线程池技术和内存池,SOCKET池技术,基本可以处理一千五百个左右的SOCKET连接,但我们一般使用的机器大约有两M内存,而在不改变线程堆栈的大小情况下,我们至多可以创建一千七八百个线程,不过也就基本动不了了。我们测试基本到一千个线程左右,机器就很慢了。
还有在WIN-XP-SP2中,对单进程中的线程的并发做了处理,默认是10个,修改的方法网上多的是。
2、SELECT模型(异步和同步)
这个模型在单线程的情况下默认是64个最大SOCKET连接。你可以修改WINSOCK2.h这个文件中的FD_SETSIZE,但不得超过底层WINSOCK的限制(1024),但如果采用多线程的话,可以处理更多,其实际的最大数量,在单线程里建议不超过1000个,至于多线程,应该也要控制线程切换的效率和数据处理的时间。应该几千个没有什么问题。
3、WSAASYNCSELECT模型
这个模型利用的是消息机制,建议不超过1000个。
4、WSAEVENTSELECT模型
这个模型利用的是事件驱动方式,单个线程不超过64个(WSAWaitForMultipleEvents最多等待64个事件),如果多SOCKET并发宜采用线程池技术,应该几千个没什么问题。
5、重叠IO
应该几千个没问题。这个毕竟是下面IOCP的一个技术基础。
6、IOCP完成端口+重叠IO
这个是解决SOCKET通信的终极武器,可惜只用在WIN上和2000以上,LINUX上好象有一个类似的EPOLL,而且好象比这个还好用,没具体用过。这个东东解决几万个SOCKET并发应该是很轻松,当然你得编程水平和技术得跟上。
从网上查看说这个东西如果使用的服务器版的操作系统和机器最大可到一百W,太恐怖了吧,那家伙自己在XP上最大达到了五万,但不断出现内存溢出的BUG。他最高到了9W。