📄 csdn_文档中心_多路复用i-o模型支持多client的实现及效率讨论.htm
字号:
</SPAN>}</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt"><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>Winsock</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN
lang=EN-US>WSAEventSelect</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>3.2 </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></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=2><SPAN style="mso-spacerun: yes">
</SPAN>SOCKET clientsockarray[FD_SETSIZE – 1];<SPAN
style="mso-spacerun: yes"> </SPAN>// FD_SETSIZE is 64
</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </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>, </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"><SPAN
lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=2>
</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><SPAN style="mso-spacerun: yes"></SPAN></SPAN><SPAN
lang=EN-US><FONT size=2> listen(listensock,
5);</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </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></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></FONT><SPAN
lang=EN-US><FONT size=2>InitSock(clientsockarray);</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </SPAN><SPAN
lang=EN-US>FD_ZERO(&readfds);</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </SPAN></FONT><SPAN lang=EN-US><FONT
size=2>FD_SET(listensock, &readfds);</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </SPAN><SPAN lang=EN-US>for (;
;)</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=2><SPAN
lang=EN-US> </SPAN></FONT><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><SPAN
style="mso-tab-count: 1"> </SPAN>nRet = select(0,
&readfds, NULL, NULL,
NULL);</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></SPAN><FONT size=2><SPAN lang=EN-US>// </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: 42pt; mso-char-indent-count: 4.0; mso-char-indent-size: 10.5pt"><SPAN
lang=EN-US><FONT size=2><SPAN
style="mso-tab-count: 1"> </SPAN>if
(FD_ISSET(listensock, &readfds))</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"><FONT
size=2><SPAN lang=EN-US> </SPAN><SPAN
lang=EN-US>{</SPAN></FONT></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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>clientsock =
accept(listensock, NULL, NULL);</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"><FONT
size=2><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"> </SPAN><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></FONT></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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>if <SPAN
style="mso-spacerun: yes">
</SPAN>(!InsertSock(clientsockarray, clientsock))</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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>{</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"><FONT
size=2><SPAN
lang=EN-US>
</SPAN><SPAN lang=EN-US>printf("</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>,</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此次连接被拒绝</SPAN><SPAN
lang=EN-US>.\n");</SPAN></FONT></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><SPAN
style="mso-tab-count: 1">
</SPAN><SPAN
style="mso-tab-count: 1">
</SPAN><SPAN style="mso-spacerun: yes">
</SPAN>closesocket(clientsock);</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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1">
</SPAN>continue;</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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>}<SPAN
style="mso-spacerun: yes"> </SPAN></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><SPAN
style="mso-tab-count: 1"> </SPAN>}</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><SPAN style="mso-spacerun: yes"><FONT
size=2> </FONT></SPAN></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"><FONT
size=2><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">
</SPAN></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></FONT></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><SPAN
style="mso-tab-count: 1"> </SPAN>for (nIndex
= 0; nIndex < FD_SETSIZE -
1; nIndex++)</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><SPAN
style="mso-tab-count: 1"> </SPAN>{</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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>if
(FD_ISSET(clientsockarray[nIndex],
&readfds))</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><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN
style="mso-tab-count: 1"> </SPAN>{</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><SPAN
style="mso-tab-count: 1">
</SPAN><SPAN
style="mso-tab-count: 2">
</SPAN>nRet = recv(clientsockarray[nIndex],
buff, sizeof(buff), 0);</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><SPAN
style="mso-tab-count: 1">
</SPAN><SPAN
style="mso-tab-count: 2">
</SPAN>if (nRet = = 0 || nRet =
= SOCKET_ERROR)</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><SPAN
style="mso-tab-count: 1">
</SPAN><SPAN
style="mso-tab-count: 2">
</SPAN>{</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; mso-char-indent-count: 3.0; mso-char-indent-size: 10.5pt"><SPAN
lang=EN-US><FONT size=2><SPAN
style="mso-tab-count: 2">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -