📄 4-3.html
字号:
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>WSAStartup() </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>初始化底层的</FONT><FONT SIZE=3>Windows Sockets DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>WSAUnhookBlockingHook() </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>恢复原始的阻塞钩子。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626822"><A NAME="_Toc336792905"><A NAME="_Toc336793381"></FONT><FONT SIZE=5>4.3.1 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>异步选择机制</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>WSAAsyncSelect()</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>I/O</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>I/O</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>WSAAsyncSelect()</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>允许对于一特定的套接口声明如下感兴趣的网络事件:</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口已准备读数据。</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口已准备写数据。</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>带外数据准备好。</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口准备接收连接请求。</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>非阻塞连接操作结束。</P>
<P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>连接关闭。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626823"><A NAME="_Toc336792906"><A NAME="_Toc336793382"></FONT><FONT SIZE=5>4.3.2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>异步支持例程</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	异步数据库函数允许应用程序用异步方式请求信息。某些网络实现和</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或配置,需要通过执行网络操作来应答这些请求。</FONT><FONT SIZE=3>WSAAsyncGetXByY()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数允许应用程序开发者不必象在使用</FONT><FONT SIZE=3>Berkeley</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>标准函数时阻塞整个</FONT><FONT SIZE=3>Windows</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>WSAAsyncGetXByY()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>请求。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626824"><A NAME="_Toc336792907"><A NAME="_Toc336793383"></FONT><FONT SIZE=5>4.3.3 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>阻塞钩子函数</A>方法</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	正如</FONT><FONT SIZE=3>4.1.1</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>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息处理可以继续,发出调用的应用程序仍然可以收到</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息。但在某些情况下,应用程序可能希望影响或改变这种伪阻塞的实现方式。</FONT><FONT SIZE=3>WSASetBlockingHook()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数就提供了这样一种功能。它使得应用程序可以替换</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现在“阻塞”操作中放弃处理器时调用的例程。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626825"><A NAME="_Toc336792908"><A NAME="_Toc336793384"></FONT><FONT SIZE=5>4.3.4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>错误处理</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	为了与基于线程的环境兼容,</FONT><FONT SIZE=3>API</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>Berkeley</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>风格的机制是通过</FONT><FONT SIZE=3>"errno"</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">	</FONT><FONT SIZE=3>WSAGetLastError()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所返回的错误代码尽量避免与标准的</FONT><FONT SIZE=3>Microsoft C</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>Microsoft C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>定义的标准错误代码之内的。如果你使用的应用程序开发环境中的错误代码定义与</FONT><FONT SIZE=3>Microsoft C</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>"WSA"</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>API</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>4.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中列举的合法</FONT><FONT SIZE=3>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误之外的任何数值。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626826"><A NAME="_Toc336792909"><A NAME="_Toc336793385"></FONT><FONT SIZE=5>4.3.5 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>通过中介</FONT><FONT SIZE=5>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>调用</FONT><FONT SIZE=5>Windows Sockets DLL</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	</FONT><FONT SIZE=3>Windows Sockets DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>既可以直接从应用程序中调用也可以通过中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用。通过中介</FONT><FONT SIZE=3>DLL</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>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>层,这样的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以同时被多个应用程序使用。担这样的</FONT><FONT SIZE=3>DLL</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>WSACleanup()</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>WSAStartup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WSACleanup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。这是因为</FONT><FONT SIZE=3>Windows Sockets DLL</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>WSACleanup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的调用来释放为任务分配的所有资源。</P>
<P ALIGN="JUSTIFY">	有至少两种方法去完成这一任务。最简单的方法是中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>具有与</FONT><FONT SIZE=3>WSAStarup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WSACleanup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类似的调用提供给应用程序使用,</FONT><FONT SIZE=3>DLL</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>WSACleanup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。另一种机制就是中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>建立一个任务句柄列表。任务句柄是从</FONT><FONT SIZE=3>GetCurrentTask()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这一个</FONT><FONT SIZE=3>Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中获得的。在中介</FONT><FONT SIZE=3>DLL</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>WSACleanup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。</P>
<P ALIGN="JUSTIFY">	在</FONT><FONT SIZE=3>Windows NT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>环境中,这一点是没有必要的。因为</FONT><FONT SIZE=3>Windows NT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构与流程是与</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不同的。在</FONT><FONT SIZE=3>Windows NT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>只需简单的在它的</FONT><FONT SIZE=3>DLL</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>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的开始时刻被执行。</P>
<P ALIGN="JUSTIFY">	如果中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用了阻塞操作而又没有安装任何它自己的阻塞钩子,那么</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作者必须清楚地认识到控制有可能会通过应用程序安装的阻塞钩子或缺省的阻塞钩子回到应用程序手中。这样应用程序有可能通过</FONT><FONT SIZE=3>WSACancelBlockingCall()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来取消中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的阻塞操作,如果这种情况发生了,中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的阻塞操作会失败并返回错误代码</FONT><FONT SIZE=3>WSAEINTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。这时候,中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>必须尽快地把控制交还给调用它的任务。因为用户有可能按了</FONT><FONT SIZE=3>Cancel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或者</FONT><FONT SIZE=3>Close</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮。应用程序正在急切地盼望获得</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的控制权。我们推荐中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在进行阻塞调用时安装自己的阻塞钩子来防止不可预见的中介</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和应用程序之间的互相影响。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626827"><A NAME="_Toc336792910"><A NAME="_Toc336793386"></FONT><FONT SIZE=5>4.3.6 Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>实现内部对消息的使用</A></A></A></P>
</B></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>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,有时在</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>内部互相发送消息来通讯和定时是必要的。这是非常合法的。但是</FONT><FONT SIZE=3>Windows DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不应该无缘无故地发送消息给一个由客户打开的窗口句柄,除非应用程序要求这些消息。所以为了自身的目的而需要使用消息的</FONT><FONT SIZE=3>Windows Sockets DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>打开了一个隐藏的窗口,并且发送必要的消息给这个窗口的句柄。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626828"><A NAME="_Toc336792911"><A NAME="_Toc336793387"></FONT><FONT SIZE=5>4.3.7 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>私有的</FONT><FONT SIZE=5>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>接口</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">	附录</FONT><FONT SIZE=3>B.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>WINSOCK.DEF</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件列出了</FONT><FONT SIZE=3>Windows Sockets API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>功能调用的序数。除了已经列出的序数值外,所有小于</FONT><FONT SIZE=3>999</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>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现来说,提供附加的私有的接口也是很方便的。这是完全可以接受的,只要这些调用的序数大于</FONT><FONT SIZE=3>1000</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,要注意的是,任何使用了某个特定</FONT><FONT SIZE=3>Windows Sockets DLL</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>Windows Sockets DLL</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>Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>实现都支持。</P>
<P ALIGN="JUSTIFY">	如果一个应用程序使用了某个供应商的</FONT><FONT SIZE=3>Windows Sockets DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的特定接口,最好不要把应用程序与</FONT><FONT SIZE=3>DLL</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>LoadLibrary()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>GetProcAddress()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>动态载入,这就使得应用程序在其他不支持同样的扩展功能集的</FONT><FONT SIZE=3>Windows Sockets DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>系统上运行时,可以得到适当的错误信息。</P></FONT></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -