⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.html

📁 WinSock编程规范及应用
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:标识套接口的描述字。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">hEventObject</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:(可选)句柄,用于标识需要复位的相应事件对象。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">lpNetworkEvents</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个</FONT><FONT SIZE=3>WSANETWORKEVENTS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的数组,每一个元素记录了一个网络事件和相应的错误代码。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">lpiCount</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:数组中的元素数目。在返回时,本参数表示数组中的实际元素数目;如果返回值是</FONT><FONT SIZE=3>WSAENOBUFS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,则表示为获取所有网络事件所需的元素数目。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果操作成功则返回</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。否则的话,将返回</FONT><FONT SIZE=3>INVALID_SOCKET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误,应用程序可通过</FONT><FONT SIZE=3>WSAGetLastError()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获取相应的错误代码。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">错误代码:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSANOTINITIALISED&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在调用本</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之前应成功调用</FONT><FONT SIZE=3>WSAStartup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENETDOWN&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络子系统失效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINVAL&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数中有非法值。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINPROGRESS&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一个阻塞的</FONT><FONT SIZE=3>WinSock</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见</FONT><FONT SIZE=3>B.3.6.6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>节)</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENOBUFS&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所提供的缓冲区太小。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">另请参阅:</FONT><FONT SIZE=3>  WSAEventSelect()</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626913"><A NAME="_Toc336792996"><A NAME="_Toc336793472"></FONT><FONT FACE="Arial" SIZE=5>7.7 WSAEnumProtocols()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述:获取现有传送协议的相关信息。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">          #include &lt;winsock2.h&gt;</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">          int WSAAPI WSAEnumProtocols ( LPDWORD</P>
<P ALIGN="JUSTIFY">          lpdwProtocols, LPVOID lpProtocolBuffer, LPDWORD</P>
<P ALIGN="JUSTIFY">          lpdwBufferLength);</P>
<P ALIGN="JUSTIFY">          </P>
<P ALIGN="JUSTIFY">lpdwProtocols</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个以</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结尾的协议标识号数组。本参数可选;如果</FONT><FONT SIZE=3>lpdwProtocols</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3> NULL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,则返回所有可用协议的信息,否则的话只返回数组中所开列的协议信息。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">lpProtocolBuffer</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个用</FONT><FONT SIZE=3>PROTOCOL_INFO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构填充的缓冲区。参见下文中对</FONT><FONT SIZE=3>PROTOCOL_INFO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的具体描述。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">lpdwBufferLength</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:输入时,存有传递给</FONT><FONT SIZE=3>WSAEnumProtocols()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的</FONT><FONT SIZE=3>lpProtocolBuffer</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>缓冲区长度。输出时,表示为获取所有信息需传递给</FONT><FONT SIZE=3>WSAEnumProtocols()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的缓冲区长度。本函数不能重复调用;传入的缓冲区必须足够大以能存放所有的元素。这个规定降低了该函数的复杂度。由于一个机器上装载的协议数目往往是很小的,所以并不会产生问题。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>若无错误发生,</FONT><FONT SIZE=3>WSAEnumProtocols()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回协议的数目。否则的话,将返回</FONT><FONT SIZE=3>INVALID_SOCKET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误,应用程序可通过</FONT><FONT SIZE=3>WSAGetLastError()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获取相应的错误代码。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">错误代码:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSANOTINITIALISED&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在调用本</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之前应成功调用</FONT><FONT SIZE=3>WSAStartup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENETDOWN&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络子系统失效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINPROGRESS&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一个阻塞</FONT><FONT SIZE=3>WinSock</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用正在进行。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINVAL&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数中有非法值。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENOBUFS&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>缓冲区太小,无法保存所有</FONT><FONT SIZE=3>PROTOCOL_INFO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构及其相关信息。传入的缓冲区大小至少应等于</FONT><FONT SIZE=3>lpdwBufferLength</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中返回的值。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626914"><A NAME="_Toc336792997"><A NAME="_Toc336793473"></FONT><FONT FACE="Arial" SIZE=5>7.8 WSAEventSelect()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述:确定与所提供的</FONT><FONT SIZE=3>FD_XXX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络事件集合相关的一个事件对象。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">          #include &lt;winsock2.h&gt;</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">          int WSAAPI WSAEventSelect ( SOCKET s, WSAEVENT</P>
<P ALIGN="JUSTIFY">          hEventObject, long lNetworkEvents );</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">          </P>
<P ALIGN="JUSTIFY">s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个标识套接口的描述字。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">hEventObject</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个句柄,用于标识与所提供的</FONT><FONT SIZE=3>FD_XXX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络事件集合相关的一个事件对象。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">lNetworkEvents</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个屏蔽位,用于指定感兴趣的</FONT><FONT SIZE=3>FD_XXX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络事件组合。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果应用程序指定的网络事件及其相应的事件对象成功设置,则返回</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。否则的话,将返回</FONT><FONT SIZE=3>INVALID_SOCKET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误,应用程序可通过</FONT><FONT SIZE=3>WSAGetLastError()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获取相应的错误代码。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在使用</FONT><FONT SIZE=3>select()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WSAAsyncSelect()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数时,</FONT><FONT SIZE=3>WSAEventSelect()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>常用来决定何时进行数据传送操作(如</FONT><FONT SIZE=3>send()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>recv()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>),并期望能立即成功。但是一个稳定的应用程序应该做好这样的准备,即事件对象被设置,并且一个</FONT><FONT SIZE=3>WinSock</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用以</FONT><FONT SIZE=3>WSAEWOULDBLOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>立即返回</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。举例来说,有可能发生下述操作序列:</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(i) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口</FONT><FONT SIZE=3>s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>上到达数据;</FONT><FONT SIZE=3>WinSock</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设置了</FONT><FONT SIZE=3>WSAEventSelect</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>事件对象。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(ii) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序进行其他操作。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(iii) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在进行操作时,应用程序调用了</FONT><FONT SIZE=3>ioctlsocket(s, FIONREAD...)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>并发现有数据可读。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(iv) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序调用一个</FONT><FONT SIZE=3>recv(s,...)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来读取数据。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(v) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>最后应用程序等待</FONT><FONT SIZE=3>WSAEventSelect()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所指定的数据对象,该数据对象指出数据可读。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">(vi) </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序调用</FONT><FONT SIZE=3>recv(s,...)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,但以</FONT><FONT SIZE=3>WSAEWOULDBLOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误失败。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">          </P>
<P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>其他的操作序列也是可能的。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成功地记录了网络事件的发生(通过设置内部网络事件记录的相应位),并且将相应的事件对象设置了信号后,不会对该网络事件作进一步的操作,直到应用程序调用了相应的函数显式地重新允许该网络事件及相应事件对象的信号。</P>
<P ALIGN="JUSTIFY">网络事件&#9;&#9;&#9;&#9;&#9;重新允许函数</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">FD_READ&#9;&#9;&#9;&#9;recv() </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3> recvfrom()</P>
<P ALIGN="JUSTIFY">FD_WRITE&#9;&#9;&#9;&#9;send() </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3> sendto()</P>
<P ALIGN="JUSTIFY">FD_OOB&#9;&#9;&#9;&#9;&#9;recv()</P>
<P ALIGN="JUSTIFY">FD_ACCEPT&#9;&#9;&#9;&#9;accept() </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>WSAAccept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,直到返回的错误代码为</FONT><FONT SIZE=3> WSATRY_AGAIN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,指明条件函数返回</FONT><FONT SIZE=3>CF_DEFER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">FD_CONNECT&#9;&#9;&#9;NONE</P>
<P ALIGN="JUSTIFY">FD_CLOSE&#9;&#9;&#9;&#9;NONE</P>
<P ALIGN="JUSTIFY">FD_QOS&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>用</FONT><FONT SIZE=3>SIO_GET_QOS </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>命令调用</FONT><FONT SIZE=3>WSAIoctl()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">FD_GROUP_QOS&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>用</FONT><FONT SIZE=3>SIO_GET_GROUP_QOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>命令调用</FONT><FONT SIZE=3>WSAIoctl()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">错误代码:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSANOTINITIALISED&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在调用本</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之前应成功调用</FONT><FONT SIZE=3>WSAStartup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENETDOWN&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络子系统失效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINVAL&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数中有非法值,或者指定的套接口处于非法状态。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAEINPROGRESS&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一个阻塞的</FONT><FONT SIZE=3>WinSock</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用正在进行中,或者服务提供者仍在处理一个回调函数。(参见</FONT><FONT SIZE=3>B.3.6.6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>节)</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">WSAENOTSOCK&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>描述字不是一个套接口。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">另请参阅:</FONT><FONT SIZE=3>WSACloseEvent() ,WSACreateEvent(),WSAEnumNetworkEvents(),WSAGetOverlappedResult(),WSAWaitForMultipleEvents().</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -