考虑到时间紧、实际同时连接数可能不超过100个,还是线程池算了
据说除了select还有poll?
另外,windows平台据说有完成端口,效率比select还要高
上面只是给简要的代码,有的辅助函数也没有给出。用select支持多Client是比较方便的,在一个线程中可支持63个;可以采用多线程支持更大数量的Client。
---为什么只是63个?更多不行吗??
4. 效率的讨论
4.1 对套接字数组扫描的效率问题
在上面的程序中,存在多处对套接字句柄的扫描处理,这个肯定会影响效率。不知道各位朋友是怎么处理这个问题的。
---简单的循环,应该是很快的了,除非FD_ISSET很慢,怎么会影响效率??
【
// 逐个处理处于待决状态的套接字
for (nIndex = 0; nIndex < FD_SETSIZE - 1; nIndex++)
{
if (FD_ISSET(clientsockarray[nIndex], &readfds))
】
4.2 对客户端实时响应问题
上面的程序处理待决的套接字的时候,是逐个处理的,如果响应某个Client的时间长到一定程度的话,肯定会影响对其它客户端的响应。我的解决方法是当这个套接字处于可读的待决状态的话,产生一个子线程去处理------接收数据和处理数据。这样主线程继续自己的工作,其它Client可以得及时的响应;当然当有大量的Client请求时,对线程的控制会成为一个新问题。
在UNIX/LINUX下做一个支持大量Client的Server的话,本人还是最先选择select这种I/O模型,这是因为我还不知道LINUX还有哪些更好的I/O模型。WinNT的话,还有CompletionPort和Overlapped,特别对于有大数据量传送,同时只有少量的Client时,Overlapped可以发挥相当大的作用。各位朋友请给出使用select的好方法。
---这个能不能做成:每个处理都只是把数据加入请求队列,立即返回。这样处理时间肯定很短了
---真正的处理由别的线程从请求队列里取出慢慢处理,但是处理完要找回那个socket以便发送回去
作者Blog:http://blog.csdn.net/HuangRG/
相关文章
Winsock I/O系列3: Overlapped I/O
WinSock I/O系列1:多路复用I/O支持多Client的实现及效率讨论
Win32下对多个的线程句柄的关闭的控制(下)
Win32下对多个的线程句柄的关闭的控制(上)
对该文的评论
thirst ( 2004-05-26)
我们正在开发“实时商务数据交换服务器”,支持并发用户〉10万。热诚邀请网络服务技术高手加盟我们的事业。我们联系地址:wubolin@ninetowns.com。
---单机能达到10万吗????不是64K已经是极限了。。。
sevencat ( 2004-05-08)
select的效率差主要在于套接字多的时候,每次重新select都要再搞一次,而每次查询的话又要再搞一次,这之间的效率在客户量多的话可能会成为瓶颈。
---循环2000、2万个也是很快的吧??
fangcheng ( 2004-05-03)
http://expert.csdn.net/Expert/topic/3029/3029973.xml?temp=.2850611
luo521 ( 2004-05-02)
select的效率太差!windows下完成端口是最有效率的!
---据说IIS5.0开始就是用它作的了。。。
Kevin_qing ( 2004-05-01)
windows下select可以使用>64的socket哈
---莫非这64真的是个什么限制、瓶颈???没感觉哪里会限制它只能64个啊???