📄 csdn_文档中心_多路复用i-o模型支持多client的实现及效率讨论.htm
字号:
</SPAN>return TRUE;</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 4.0; mso-char-indent-size: 10.5pt"><SPAN
lang=EN-US><FONT size=2> }</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 4.0; mso-char-indent-size: 10.5pt"><SPAN
lang=EN-US><FONT size=2> <o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=2><SPAN
lang=EN-US><SPAN
style="mso-spacerun: yes">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面只是给简要的代码,有的辅助函数也没有给出。用</SPAN><SPAN
lang=EN-US>select</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持多</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是比较方便的,在一个线程中可支持</SPAN><SPAN
lang=EN-US>63</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个;可以采用多线程支持更大数量的</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT
size=2><SPAN lang=EN-US>4.<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">效率的讨论</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=2><SPAN
lang=EN-US>4.1 </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对套接字数组扫描的效率问题</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=2><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
</SPAN></FONT><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=2>在上面的程序中,存在多处对套接字句柄的扫描处理,这个肯定会影响效率。不知道各位朋友是怎么处理这个问题的。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=2><SPAN
lang=EN-US>4.2 </SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对客户端实时响应问题</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的程序处理待决的套接字的时候,是逐个处理的,如果响应某个</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时间长到一定程度的话,肯定会影响对其它客户端的响应。我的解决方法是当这个套接字处于可读的待决状态的话,产生一个子线程去处理</SPAN><SPAN
lang=EN-US>------</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接收数据和处理数据。这样主线程继续自己的工作,其它</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以得及时的响应;当然当有大量的</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">请求时,对线程的控制会成为一个新问题。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN
lang=EN-US>UNIX/LINUX</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下做一个支持大量</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN
lang=EN-US>Server</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的话,本人还是最先选择</SPAN><SPAN
lang=EN-US>select</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种</SPAN><SPAN
lang=EN-US>I/O</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模型,这是因为我还不知道</SPAN><SPAN
lang=EN-US>LINUX</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有哪些更好的</SPAN><SPAN
lang=EN-US>I/O</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模型。</SPAN><SPAN
lang=EN-US>WinNT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的话,还有</SPAN><SPAN
lang=EN-US>CompletionPort</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN
lang=EN-US>Overlapped</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,特别对于有大数据量传送,同时只有少量的</SPAN><SPAN
lang=EN-US>Client</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时,</SPAN><SPAN
lang=EN-US>Overlapped</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以发挥相当大的作用。各位朋友请给出使用</SPAN><SPAN
lang=EN-US>select</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的好方法。</SPAN></FONT></P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT
src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> sevencat <I>(2004-5-8
9:21:32)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>select的效率差主要在于套接字多的时候,每次重新select都要再搞一次,而每次查询的话又要再搞一次,这之间的效率在客户量多的话可能会成为瓶颈。
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> fangcheng <I>(2004-5-3
15:24:49)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>http://expert.csdn.net/Expert/topic/3029/3029973.xml?temp=.2850611
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> luo521 <I>(2004-5-2
22:28:53)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>select的效率太差!windows下完成端口是最有效率的! <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> Kevin_qing <I>(2004-5-1
23:55:15)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>windows下select可以使用>64的socket哈 <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> sevencat <I>(2004-4-30
14:27:56)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>linux里的select的内部实现可能跟poll实现是一样的,连微软的select实现内部调用的flag也是POLL(@_@)
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> sevencat <I>(2004-4-30
14:21:59)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>效率:poll(6)>poll(2)>select #define FD_SIZE 128
这样可以不止支持64个client nResult = select( 0, //
Windows中这个参数忽略,Linux中在此处为1//?maxfd+1? readfds, // 可读套接字集合 …… )
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> Darkay_Lee <I>(2004-4-27
20:48:36)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>要应对这些复杂的兼容性问题,是使用ACE的最大优势了。
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> midholy <I>(2004-4-27
15:31:00)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>linux 2.6.x里面也支持
/dev/poll的模式啦。性能要比 select平稳。但主要用在有大量客户的服务器上。
jabberd的服务器用的就是/dev/poll的方法,还有个著名的邮件服务器(记不得了sendmail?)也用的是/dev/poll....
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16
hspace=1 src="CSDN_文档中心_多路复用I-O模型支持多Client的实现及效率讨论.files/ico_pencil.gif"
width=16> </SPAN> HuangRG <I>(2004-4-27
11:28:49)</I> </TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3
width=532><BR>在Linux下比select好的是有的,只是很少人在用,这方面的资料也不多.在UNIX/Linu下开
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -