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

📄 5-3.html

📁 介绍各种平台进行SOCKET编程的好东东。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>5</TITLE>
</HEAD>
<BODY>

<B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626862"><A NAME="_Toc336792945"><A NAME="_Toc336793421"></FONT><FONT FACE="Arial" SIZE=5>5.3 Windows</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>扩展函数</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626863"><A NAME="_Toc336792946"><A NAME="_Toc336793422"></FONT><FONT SIZE=5>5.3.1 WSAAsyncGetHostByAddr()</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;HANDLE PASCAL FAR WSAAsyncGetHostByAddr ( HWND hWnd,</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;unsigned int wMsg,  const char FAR * addr, int len, int</P>
<P ALIGN="JUSTIFY">&#9;&#9;&#9;type, char FAR * buf, int buflen );</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">&#9;</P>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT SIZE=3>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;addr    </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;len </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址长度</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对于</FONT><FONT SIZE=3>PF_INET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来说必须为</FONT><FONT SIZE=3>4.</P>
<P ALIGN="JUSTIFY">&#9;type    </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址类型</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>必须是</FONT><FONT SIZE=3>PF_INET.</P>
<P ALIGN="JUSTIFY">&#9;buf </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>接收</FONT><FONT SIZE=3>hostent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>数据的数据区指针</FONT><FONT SIZE=3>.</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注意该数据区必须大于</FONT><FONT SIZE=3>hostent</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>hostent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构</FONT><FONT SIZE=3>,hostent</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>gethostbyaddr()</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>hostent</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>hostent</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>WSAAsyncGetHostByAddr().(</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>,WSAAsyncGetHostByAddr()</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>
<P ALIGN="JUSTIFY">&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果异步操作不能初启</FONT><FONT SIZE=3>,WSAAsyncGetHostByAddr()</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>WSAGetLastError()</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;Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现使用提供给该函数的缓冲区来构造</FONT><FONT SIZE=3>hostent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构以及该结构成员引用的数据区内容</FONT><FONT SIZE=3>.</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>,</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"></P>
</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>

⌨️ 快捷键说明

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