﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Cass/*蓝草莓日记-文章分类-网络编程</title><link>http://www.cppblog.com/Cass/category/17623.html</link><description>是以至此，就不必难过了。




</description><language>zh-cn</language><lastBuildDate>Thu, 25 Aug 2011 04:54:04 GMT</lastBuildDate><pubDate>Thu, 25 Aug 2011 04:54:04 GMT</pubDate><ttl>60</ttl><item><title>使用WSAEventSelect模型的5个问题</title><link>http://www.cppblog.com/Cass/articles/154246.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Wed, 24 Aug 2011 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/154246.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/154246.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/154246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/154246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/154246.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 10pt">WSAEventSelect<span style="font-family: '微软雅黑','sans-serif'">是提供以网络事件的异步方式通知模型，为套接字注册网络事件后等待通知，故是被动发生的。具体流程可以参照如下图<br /><span style="font-family: 'Tahoma','sans-serif'; font-size: 11pt; mso-fareast-font-family: 微软雅黑; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/cass/WSAEventSelect图.jpg" width="642" longdesc="" height="438" /><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span><br /></p>
<p style="margin: 0cm 0cm 10pt">MSDN<span style="font-family: '微软雅黑','sans-serif'">的网络事件</span></p>
<p style="margin: 0cm 0cm 10pt">
<table style="border-bottom: medium none; border-left: medium none; width: 100%; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr style="height: 15.75pt">
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 3pt; padding-left: 3pt; padding-right: 3pt;background: #e5e5e5; height: 15.75pt; border-top: #bbbbbb 1pt solid; border-right: #bbbbbb 1pt solid; padding-top: 3pt" valign="top">
<p style="layout-grid-mode: both"><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 10.5pt">Network event</span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 3pt; padding-left: 3pt; padding-right: 3pt;background: #e5e5e5; height: 15.75pt; border-top: #bbbbbb 1pt solid; border-right: #bbbbbb 1pt solid; padding-top: 3pt" valign="top">
<p style="layout-grid-mode: both"><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 10.5pt">Re-enabling function</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_READ </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms740121(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">recv</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms740120(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">recvfrom</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms741688(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecv</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms741684(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecvEx</span></strong></a>, or <a href="http://msdn.microsoft.com/en-us/library/ms741686(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecvFrom</span></strong></a> function.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_WRITE </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms740149(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">send</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms740148(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">sendto</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms742203(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSASend</span></strong></a>, or <a href="http://msdn.microsoft.com/en-us/library/ms741693(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSASendTo</span></strong></a> function.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_OOB </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms740121(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">recv</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms740120(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">recvfrom</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms741688(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecv</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms741684(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecvEx</span></strong></a>, or <a href="http://msdn.microsoft.com/en-us/library/ms741686(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSARecvFrom</span></strong></a> function.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_ACCEPT </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms737526(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">accept</span></strong></a>, <a href="http://msdn.microsoft.com/en-us/library/ms737524(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">AcceptEx</span></strong></a>, or <a href="http://msdn.microsoft.com/en-us/library/ms741513(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSAAccept</span></strong></a> function unless the error code returned is WSATRY_AGAIN indicating that the condition function returned CF_DEFER.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_CONNECT </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">None.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_CLOSE </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">None.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_QOS </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms741621(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSAIoctl</span></strong></a> function with command </span><strong><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">SIO_GET_QOS</span></strong><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_GROUP_QOS </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">Reserved.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_ROUTING_ INTERFACE_CHANGE </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms741621(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSAIoctl</span></strong></a> function with command </span><strong><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">SIO_ROUTING_INTERFACE_CHANGE</span></strong><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">.</span></p></td></tr>
<tr>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #bbbbbb 1pt solid; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">FD_ADDRESS_ LIST_CHANGE </span></p></td>
<td style="border-bottom: #bbbbbb 1pt solid; border-left: #f0f0f0; padding-bottom: 6.75pt; padding-left: 3pt; padding-right: 3pt;background: white; border-top: #f0f0f0; border-right: #bbbbbb 1pt solid; padding-top: 6.75pt" valign="top">
<p style="line-height: 140%; margin: 0cm 0.75pt 0pt; layout-grid-mode: both"><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">The <a href="http://msdn.microsoft.com/en-us/library/ms741621(v=vs.85).aspx"><strong><span style="line-height: 140%; color: #1364c4; text-decoration: none; text-underline: none">WSAIoctl</span></strong></a> function with command </span><strong><span style="line-height: 140%; font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9.5pt">SIO_ADDRESS_LIST_CHANGE</span></strong></p></td></tr></tbody></table></p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">能够熟练运用</span><span lang="EN-US"><font face="Tahoma">WSAEventSelect</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">必须注意以下</span><span lang="EN-US"><font face="Tahoma">5</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">点</span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1" class="MsoNormal"><span style="mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">1、</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">必须创建事件表和套接字表，并把监听套接字放到表的首位。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 10pt 18pt; mso-list: l1 level1 lfo2" class="MsoNormal"><span style="font-size: 12pt; mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">&#9312;</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">、对于</span><span style="font-size: 12pt" lang="EN-US"><font face="Tahoma">TCP</font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">而言：关联监听套接字必须处理</span><span style="font-size: 12pt"><font face="Tahoma"> <span lang="EN-US">(FD_ACCEPT</span></font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">或者</span><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体" lang="EN-US">FD_CONNECT</span><span style="font-size: 12pt" lang="EN-US"><font face="Tahoma">) </font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">和</span><span style="font-size: 12pt" lang="EN-US"><font face="Tahoma">FD_CLOSE</font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">事件。监听套接字不参与通信</span><span style="font-size: 12pt"><font face="Tahoma"> </font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">，故</span><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体" lang="EN-US">FD_WRITE<span style="mso-spacerun: yes">&nbsp; </span></span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI'; mso-bidi-font-family: 'Segoe UI'">不需要关联。而由</span><span style="font-family: '微软雅黑','sans-serif'; letter-spacing: 0.4pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">通信套接字创建的网络事件则按连接顺序放到事件表和套接字表。这时需要处理的事件有</span><span style="letter-spacing: 0.4pt" lang="EN-US"><font face="Tahoma">FD_READ </font></span><span style="font-family: '微软雅黑','sans-serif'; letter-spacing: 0.4pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">和</span><span style="letter-spacing: 0.4pt" lang="EN-US"><font face="Tahoma">FD_CLOSE </font></span><span style="font-family: '微软雅黑','sans-serif'; letter-spacing: 0.4pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">和</span><span style="letter-spacing: 0.4pt" lang="EN-US"><font face="Tahoma">FD_WRITE</font></span><span style="font-family: '微软雅黑','sans-serif'; letter-spacing: 0.4pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 10pt 18pt; mso-list: l1 level1 lfo2" class="MsoNormal"><span style="font-size: 12pt; mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">&#9313;</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">对于</span><span style="font-size: 12pt" lang="EN-US"><font face="Tahoma">UDP</font></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 12pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">不存在连接，故只需要处理</span><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体" lang="EN-US">FD_WRITE </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI'; mso-bidi-font-family: 'Segoe UI'">或者</span><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体" lang="EN-US">FD_READ </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI'; mso-bidi-font-family: 'Segoe UI'">就可以、</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 10pt 18pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Tahoma">&nbsp;</font></o:p></span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1" class="MsoNormal"><span style="mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">2、</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">什么是&#8220;</span><span lang="EN-US"><font face="Tahoma">WSAEnumNetworkEvents</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">函数会自动重置受信事件&#8221;！</span></p>
<p style="margin: 0cm 0cm 10pt" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">大家知道</span><span lang="EN-US"><font face="Tahoma">WSAEnumNetworkEvents</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">是查询套接字上的发生的网络事件和出错代码。然而对于第二个参数，</span><span style="letter-spacing: 0.4pt" lang="EN-US"><font face="Tahoma">hEventObject</font></span><span style="font-family: '微软雅黑','sans-serif'; letter-spacing: 0.4pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">。其实重置受信事件则是清除系统内部的网络事件记录。当调用一次</span><span lang="EN-US"><font face="Tahoma">WSAEnumNetworkEvents </font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">返回</span><span lang="EN-US"><font face="Tahoma">event</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">（</span><span lang="EN-US"><font face="Tahoma">WSAEVENT</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">）事件</span><font face="Tahoma"> </font><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">，接下来就应该是处理该事件的代码。如果没有清除该事件对象的网络事件，那么有可能出现不断处理的该事件的结果。</span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1" class="MsoNormal"><span style="mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">3、</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">一个连接关闭时应该在事件表和套接字表中删除该套接字和事件。并在事件表和套接字表上把其他的前移。以便省留更多的位置给新的连接，要知道在不创建线程池的情况下，</span><span lang="EN-US"><font face="Tahoma">WSAEventSelect</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">模型最多也就是能支持</span><span lang="EN-US"><font face="Tahoma">64 -1</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">个连接、</span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1" class="MsoNormal"><span style="mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">4、</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">如果同时有几个事件对象受信</span><span lang="EN-US"><font face="Tahoma">WSAWaitForMultipleEvents</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">函数只返回，最前面的一个，因此要从最前面受信事件开始逐个检查后面的受信事件，此时使用</span><span lang="EN-US"><font face="Tahoma">WSAWaitForMultipleEvents</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">就要设置超时返回了，也就是</span><span lang="EN-US"><font face="Tahoma">dwTimeout</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">参数、</span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1" class="MsoNormal"><span style="mso-fareast-font-family: Tahoma; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-list: Ignore"><font face="Tahoma">5、</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US"><font face="Tahoma">IP</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">地址与套接字的关联问题，在接受众多连接后想要向某一连接发送数据，则需要找到该</span><span lang="EN-US"><font face="Tahoma">IP</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">地址（或者主机名也行）与服务器建立的通信套接字。那么套接字表就不能是简单的套接字集合了，或许可以这样</span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma">struct SOCKET_ADDR<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>//</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">用来记录客户区信息的对象</span><span lang="EN-US"><font face="Tahoma"> </font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma">{</font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp; </span>SOCKET s;</font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp; </span>sockaddr_in in_addr;<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma">};</font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">而套接字表为</span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span lang="EN-US"><font face="Tahoma">SOCKET_ADDR<span style="mso-spacerun: yes">&nbsp; </span>sockArray[64];</font></span></p>
<p style="margin: 0cm 0cm 10pt 36pt" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">：：更加受欢迎的做法就是符合面向对象套接字链表了。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma">typedef struct _SOCKET_OBJ</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma">{</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SOCKET s;<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">套节字句柄</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HANDLE event;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">与此套节字相关联的事件对象句柄</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sockaddr_in addrRemote;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">客户端地址信息</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_SOCKET_OBJ *pNext;// </font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">指向下一个</span><span lang="EN-US"><font face="Tahoma">SOCKET_OBJ</font></span><span style="font-family: '微软雅黑','sans-serif'; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma">对象，为的是连成一个表</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNoSpacing"><span lang="EN-US"><font face="Tahoma">} SOCKET_OBJ, *PSOCKET_OBJ;</font></span></p>
<p style="margin: 0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Tahoma">&nbsp;</font></o:p></span></p>
<p style="margin: 0cm 0cm 10pt"><br /><br /></span>&nbsp;</p> <img src ="http://www.cppblog.com/Cass/aggbug/154246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-08-24 21:25 <a href="http://www.cppblog.com/Cass/articles/154246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解select模型的六大注意点</title><link>http://www.cppblog.com/Cass/articles/154168.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 23 Aug 2011 13:07:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/154168.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/154168.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/154168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/154168.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/154168.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 10pt">Select<span style="font-family: '微软雅黑','sans-serif'">模型出现的目的：：模型的出现是为了解决</span>&#8220;<span style="font-family: '微软雅黑','sans-serif'">一个客户端一线程</span>&#8221;<span style="font-family: '微软雅黑','sans-serif'">的问题，为了</span>WINDOWS<span style="font-family: '微软雅黑','sans-serif'">的线程切换不要太频繁。</span></p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">select<span style="font-family: '微软雅黑','sans-serif'">函数</span></p>
<p style="margin: 0cm 0cm 10pt">int select(</p>
<p style="margin: 0cm 0cm 10pt">int maxfdp,<span>&nbsp;&nbsp; //</span><span style="font-family: '微软雅黑','sans-serif'">忽略</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set *readfds,//<span style="font-family: '微软雅黑','sans-serif'">检查可读性</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set *writefds,<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: '微软雅黑','sans-serif'">检查可写性</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set *errorfds,<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: '微软雅黑','sans-serif'">检查错误</span></p>
<p style="margin: 0cm 0cm 10pt">struct timeval *timeout<span>&nbsp;&nbsp; //</span><span style="font-family: '微软雅黑','sans-serif'">指定函数等待的最长时间</span></p>
<p style="margin: 0cm 0cm 10pt">); </p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">1<span style="font-family: '微软雅黑','sans-serif'">、理解</span>struct fd_set<span style="font-family: '微软雅黑','sans-serif'">（一个套接字集合）</span></p>
<p style="margin: 0cm 0cm 10pt">struct fd_set<span style="font-family: '微软雅黑','sans-serif'">可以理解为一个集合，这个集合中存放的是文件描述符</span>(filedescriptor)<span style="font-family: '微软雅黑','sans-serif'">，即文件句柄，这可以是我们所说的普通意义的文件，当然</span>Unix<span style="font-family: '微软雅黑','sans-serif'">下任何设备、管道、</span>FIFO<span style="font-family: '微软雅黑','sans-serif'">等都是文件形式，全部包括在内，所以毫无疑问一个</span>socket<span style="font-family: '微软雅黑','sans-serif'">就是一个文件，</span>socket<span style="font-family: '微软雅黑','sans-serif'">句柄就是一个文件描述符。</span></p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">2<span style="font-family: '微软雅黑','sans-serif'">、使用</span>struct fd_set</p>
<p style="margin: 0cm 0cm 10pt">FD_ZERO(fd_set * set)<span style="font-family: '微软雅黑','sans-serif'">；</span> //<span style="font-family: '微软雅黑','sans-serif'">清空集合</span></p>
<p style="margin: 0cm 0cm 10pt">FD_SET(s,fd_set * set)<span style="font-family: '微软雅黑','sans-serif'">；</span> //<span style="font-family: '微软雅黑','sans-serif'">添加套接字集合</span></p>
<p style="margin: 0cm 0cm 10pt">FD_CLR(s ,fd_set* set)<span style="font-family: '微软雅黑','sans-serif'">；</span>&nbsp;//<span style="font-family: '微软雅黑','sans-serif'">从</span>set<span style="font-family: '微软雅黑','sans-serif'">移除套接字</span>s</p>
<p style="margin: 0cm 0cm 10pt">FD_ISSET(s ,fd_set* set)<span style="font-family: '微软雅黑','sans-serif'">；</span>//<span style="font-family: '微软雅黑','sans-serif'">检查集合中</span>s<span style="font-family: '微软雅黑','sans-serif'">是否</span>set<span style="font-family: '微软雅黑','sans-serif'">的成员</span></p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">3<span style="font-family: '微软雅黑','sans-serif'">、</span>struct timeval</p>
<p style="margin: 0cm 0cm 10pt">struct timeval { <span style="font-family: '微软雅黑','sans-serif'">　　</span></p>
<p style="margin: 0cm 0cm 10pt">time_t tv_sec; /* <span style="font-family: '微软雅黑','sans-serif'">秒</span>*/ <span style="font-family: '微软雅黑','sans-serif'">　　</span></p>
<p style="margin: 0cm 0cm 10pt">suseconds_t tv_usec; /* <span style="font-family: '微软雅黑','sans-serif'">微秒</span>*/ <span style="font-family: '微软雅黑','sans-serif'">　</span>};</p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">4<span style="font-family: '微软雅黑','sans-serif'">、参数含义</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set*readfds<span style="font-family: '微软雅黑','sans-serif'">我们是要监视这些文件描述符的读变化的，即我们关心是否可以从这些文件中读取数据了，如果这个集合中有一个文件可读，</span>select<span style="font-family: '微软雅黑','sans-serif'">就会返回一个大于</span>0<span style="font-family: '微软雅黑','sans-serif'">的值，表示有文件可读，如果没有可读的文件，则根据</span>timeout<span style="font-family: '微软雅黑','sans-serif'">参数再判断是否超时，若超出</span>timeout<span style="font-family: '微软雅黑','sans-serif'">的时间，</span>select<span style="font-family: '微软雅黑','sans-serif'">返回</span>0<span style="font-family: '微软雅黑','sans-serif'">，若发生错误返回负值。可以传入</span>NULL<span style="font-family: '微软雅黑','sans-serif'">值，表示不关心任何文件的读变化。</span> <span style="font-family: '微软雅黑','sans-serif'">　　</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set*writefds<span style="font-family: '微软雅黑','sans-serif'">我们是要监视这些文件描述符的写变化的，即我们关心是否可以向这些文件中写入数据了，如果这个集合中有一个文件可写，</span>select<span style="font-family: '微软雅黑','sans-serif'">就会返回一个大于</span>0<span style="font-family: '微软雅黑','sans-serif'">的值，表示有文件可写，如果没有可写的文件，则根据</span>timeout<span style="font-family: '微软雅黑','sans-serif'">参数再判断是否超时，若超出</span>timeout<span style="font-family: '微软雅黑','sans-serif'">的时间，</span>select<span style="font-family: '微软雅黑','sans-serif'">返回</span>0<span style="font-family: '微软雅黑','sans-serif'">，若发生错误返回负值。可以传入</span>NULL<span style="font-family: '微软雅黑','sans-serif'">值，表示不关心任何文件的写变化。</span> <span style="font-family: '微软雅黑','sans-serif'">　　</span></p>
<p style="margin: 0cm 0cm 10pt">fd_set *errorfds<span style="font-family: '微软雅黑','sans-serif'">同上面两个参数的意图，用来监视文件错误异常。</span> </p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">5<span style="font-family: '微软雅黑','sans-serif'">、超时的设置</span></p>
<p style="margin: 0cm 0cm 10pt">struct timeval *timeout<span style="font-family: '微软雅黑','sans-serif'">是</span>select<span style="font-family: '微软雅黑','sans-serif'">的超时时间，这个参数至关重要，它可以使</span>select<span style="font-family: '微软雅黑','sans-serif'">处于三种状态</span></p>
<p style="margin: 0cm 0cm 10pt"><span style="font-family: '微软雅黑','sans-serif'">&#9312;、若将</span>NULL<span style="font-family: '微软雅黑','sans-serif'">以形参传入，即不传入时间结构，就是将</span>select<span style="font-family: '微软雅黑','sans-serif'">置于阻塞状态，一定等到监视文件描述符集合中某个文件描述符发生变化为止；</span></p>
<p style="margin: 0cm 0cm 10pt"><span style="font-family: '微软雅黑','sans-serif'">&#9313;、若将时间值设为</span>0<span style="font-family: '微软雅黑','sans-serif'">秒</span>0<span style="font-family: '微软雅黑','sans-serif'">毫秒，就变成一个纯粹的非阻塞函数，不管文件描述符是否有变化，都立刻返回继续执行，文件无变化返回</span>0<span style="font-family: '微软雅黑','sans-serif'">，有变化返回一个正值；</span></p>
<p style="margin: 0cm 0cm 10pt"><span style="font-family: '微软雅黑','sans-serif'">&#9314;、</span>timeout<span style="font-family: '微软雅黑','sans-serif'">的值大于</span>0<span style="font-family: '微软雅黑','sans-serif'">，这就是等待的超时时间，即</span>select<span style="font-family: '微软雅黑','sans-serif'">在</span>timeout<span style="font-family: '微软雅黑','sans-serif'">时间内阻塞，超时时间之内有事件到来就返回了，否则在超时后不管怎样一定返回，返回值同上述。</span> </p>
<p style="margin: 0cm 0cm 10pt">&nbsp;</p>
<p style="margin: 0cm 0cm 10pt">6<span style="font-family: '微软雅黑','sans-serif'">、返回值：</span> <span style="font-family: '微软雅黑','sans-serif'">　　</span></p>
<p style="margin: 0cm 0cm 10pt"><span style="font-family: '微软雅黑','sans-serif'">负值：</span>select<span style="font-family: '微软雅黑','sans-serif'">错误</span> <span style="font-family: '微软雅黑','sans-serif'">正值：某些文件可读写或出错</span> 0<span style="font-family: '微软雅黑','sans-serif'">：等待超时，没有可读写或错误的文件<br /><br /><br /><span style="font-family: 'Tahoma','sans-serif'; font-size: 11pt; mso-fareast-font-family: 微软雅黑; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/cass/select.jpg" width="716" height="306" /><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span></span></p> <img src ="http://www.cppblog.com/Cass/aggbug/154168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-08-23 21:07 <a href="http://www.cppblog.com/Cass/articles/154168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>