📄 5-3.html
字号:
<P ALIGN="JUSTIFY">	</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>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>
</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>的实现使用提供给该函数的缓冲区来构造</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>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>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">关于</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供者的说明:</P>
<P ALIGN="JUSTIFY">	</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">	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">	</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">	WSAENETDOWN WINDOWS SOCKETS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现已检测到网络子系统故障</FONT><FONT SIZE=3>. </P>
<P ALIGN="JUSTIFY">	WSAENOBUFS </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可用的缓冲区空间不足或没有</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">	WSAHOST_NOT_FOUND </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>未找到授权应答主机</FONT><FONT SIZE=3>.</P>
<P ALIGN="JUSTIFY">	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">	WSANO_RECOVERY </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不可恢复性错误</FONT><FONT SIZE=3>,FORMERR,REFUSED,NOTIMP.</P>
<P ALIGN="JUSTIFY">	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">	</P>
<P ALIGN="JUSTIFY">	</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">	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">	WSAENETDOWN WINDOWS SOCKETS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现已检测到网络子系统故障</FONT><FONT SIZE=3>. </P>
<P ALIGN="JUSTIFY">	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">	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">	getprotobyname(), WSACancelAsyncRequest()</P>
<P ALIGN="JUSTIFY">	</P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626866"><A NAME="_Toc336792949"><A NAME="_Toc336793425"></FONT><FONT SIZE=5>5.3.4 WSAAsyncGetProtoByNumber()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述</FONT><FONT SIZE=3>:</P>
<P ALIGN="JUSTIFY">	</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">	#include <winsock.h></P>
<P ALIGN="JUSTIFY">	</P>
<P ALIGN="JUSTIFY">			HANDLE PASCAL FAR WSAAsyncGetProtoByNumber ( HWND hWnd,</P>
<P ALIGN="JUSTIFY">			unsigned int wMsg, int number, char FAR * buf, int buflen);</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">	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">	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">	number </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">	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">	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">	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本函数是</FONT><FONT SIZE=3>getprotobynumber()</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">	</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>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	注意若错误代码为</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>WSAAsyncGetProtoByNumber().(</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">	</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">			#define WSAGETASYNCERROR(lParam) HIWORD(lParam)</P>
<P ALIGN="JUSTIFY">			#define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam)</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	</P>
<P ALIGN="JUSTIFY">	使用这些宏可最大地提高应用程序源代码的可移植性</FONT><FONT SIZE=3>.</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -