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

📄 5-3.html

📁 介绍各种平台进行SOCKET编程的好东东。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">关于</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供者的说明:</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现应保证消息能成功地传给应用程序</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果</FONT><FONT SIZE=3>PostMessage()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作失败</FONT><FONT SIZE=3>,Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现必须重发该消息-只要窗口存在</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的提供者在消息中组织</FONT><FONT SIZE=3>lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时应使用</FONT><FONT SIZE=3>WSAMAKEASYNCREPLY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">错误代码</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在应用程序的窗口收到消息时可能会设置下列的错误代码</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如上所述</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>它们可以通过</FONT><FONT SIZE=3>WSAGETASYNCERROR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏从应答的消息</FONT><FONT SIZE=3>lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中取出</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;WSAENETDOWN     WINDOWS SOCKETS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现已检测到网络子系统故障</FONT><FONT SIZE=3>.  </P>
<P ALIGN="JUSTIFY">&#9;WSAENOBUFS          </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可用的缓冲区空间不足或没有</FONT><FONT SIZE=3>.</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">&#9;</FONT><FONT SIZE=3>WSAHOST_NOT_FOUND   </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>未找到授权应答主机</FONT><FONT SIZE=3>.</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">&#9;</FONT><FONT SIZE=3>WSATRY_AGAIN        </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>未找到非授权应答主机</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>SERVERFAIL.</P>
<P ALIGN="JUSTIFY">&#9;WSANO_RECOVERY      </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不可恢复性错误</FONT><FONT SIZE=3>,FORMERR,REFUSED,NOTIMP.</P>
<P ALIGN="JUSTIFY">&#9;WSANO_DATA          </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>合法名</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>无请求类型的数据记录</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>下列的错误可能在函数调用时发生</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指出异步操作不能初启</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;WSANOTINITIALISED       </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>调用</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;WSAENETDOWN     WINDOWS SOCKETS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现已检测到网络子系统故障</FONT><FONT SIZE=3>.  </P>
<P ALIGN="JUSTIFY">&#9;WSAEINPROGRESS      </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一个阻塞的</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作正在进行</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;WSAEWOULDBLOCK      </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本异步操作此时由于</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现的资源或其它限制的制约而无法调度</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">参见</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;gethostbyname(), WSACancelAsyncRequest()</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626865"><A NAME="_Toc336792948"><A NAME="_Toc336793424"></FONT><FONT SIZE=5>5.3.3 WSAAsyncGetProtoByName()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>获得对应于一个协议名的协议信息</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>-异步版本</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;#include &lt;winsock.h&gt;</P>
<P ALIGN="JUSTIFY">&#9;</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;HANDLE PASCAL FAR WSAAsyncGetProtoByName ( HWND hWnd,</P>
<P ALIGN="JUSTIFY">&#9;unsigned int wMsg,  const char FAR * name, char FAR * buf,</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;int buflen );</P>
<P ALIGN="JUSTIFY">&#9;</P>
<P ALIGN="JUSTIFY">&#9;hWnd    </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当异步请求完成时</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应该接收消息的窗口句柄</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;wMsg    </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当异步请求完成时</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将要接收的消息</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;name    </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指向要获得的协议名的指针</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;buf </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>接收</FONT><FONT SIZE=3>protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>数据的数据区指针</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注意该数据区必须大于</FONT><FONT SIZE=3>protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的大小</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这是因为不仅</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现要用该数据区域容纳</FONT><FONT SIZE=3>protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构</FONT><FONT SIZE=3>,protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的成员引用的所有数据也要在该区域内</FONT><FONT SIZE=3>. </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>建议用户提供一个</FONT><FONT SIZE=3>MAXGETHOSTSTRUCT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>字节大小的缓冲区</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;buflen  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>上述数据区的大小</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">注释</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本函数是</FONT><FONT SIZE=3>getprotobyname()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的异步版本</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是用来获取对应于一个协议名的协议名称和代号</FONT><FONT SIZE=3>.Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现启动该操作后立刻返回调用方</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>并传回一个异步任务句柄</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序可以用它来标识该操作</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当操作完成时</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结果</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>若有的话</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将会拷贝到调用方提供的缓冲区</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>同时向应用程序的窗口发一条消息</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当异步操作完成时</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的窗口</FONT><FONT SIZE=3>hWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>接收到消息</FONT><FONT SIZE=3>wMsg. wParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数包含了初次函数调用时返回的异步任务句柄</FONT><FONT SIZE=3>.lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的高</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位包含着错误代码</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>该代码可以是</FONT><FONT SIZE=3>winsock.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义的任何错误</FONT><FONT SIZE=3>.</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>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在成功完成的情况下</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供给初始函数调用的缓冲区中包含了一个</FONT><FONT SIZE=3>protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为存取该结构中的元素</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>初始的缓冲区指针应置为</FONT><FONT SIZE=3>protoent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的指针</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>并一如平常地存取</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注意若错误代码为</FONT><FONT SIZE=3>WSAENOBUFS,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>它说明在初始调用时由</FONT><FONT SIZE=3>buflen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指出的缓冲区大小对于容纳所有的结果信息来说太小了</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在这种情况下</FONT><FONT SIZE=3>,lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的低</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位含有提供所有信息所需的缓冲区大小数值</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果应用程序认为获取的数据不够</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>它就可以在设置了足够容纳所需信息的缓冲区后</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>重新调用</FONT><FONT SIZE=3>WSAAsyncGetProtoByName().(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>也就是大于</FONT><FONT SIZE=3>lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>低</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位提供的大小</FONT><FONT SIZE=3>.)</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误代码和缓冲区大小应使用</FONT><FONT SIZE=3>WSAGETASYNCERROR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WSAGETASYNCBUFLEN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏从</FONT><FONT SIZE=3>lParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中取出</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>两个宏定义如下</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)</P>
<P ALIGN="JUSTIFY">&#9;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">&#9;使用这些宏可最大地提高应用程序源代码的可移植性</FONT><FONT SIZE=3>.</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回值指出异步操作是否成功地初启</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注意它并不隐含操作本身的成功或失败</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>若操作成功地初启</FONT><FONT SIZE=3>,WSAAsyncGetProtoByName()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回一个</FONT><FONT SIZE=3>HANDLE</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>, </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作为请求需要的异步任务句柄</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>该值可在两种方式下使用</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>它可通过</FONT><FONT SIZE=3>WSACancelAsyncRequest()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>用来取消该操作</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>也可通过检查</FONT><FONT SIZE=3>wParam</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息参数</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>以匹配异步操作和完成消息</FONT><FONT SIZE=3>.</P>

⌨️ 快捷键说明

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