中国开发网: 论坛: 程序员情感CBD: 贴子 102234
haitao
都进来探讨探讨。。。
考虑到时间紧、实际同时连接数可能不超过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个啊???
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录