📄 6-9.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>6</TITLE>
</HEAD>
<BODY>
<B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626897"><A NAME="_Toc336792981"><A NAME="_Toc336793457"></FONT><FONT FACE="Arial" SIZE=5>6.9 </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 2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>引入了</FONT><FONT SIZE=3>WSADuplicateSocket()</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 3.1</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 95</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>WSADuplicateSocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数,因为一个套接口描述字在进程的所有线程中都有效。</P>
<P ALIGN="JUSTIFY">	基于一个共享套接口的两个或者单个套接口描述字应该独立地使用套接口</FONT><FONT SIZE=3>I/O</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>setsockopt()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作后,对所有的套接口描述字应用</FONT><FONT SIZE=3>getsockopt()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作都可以看到这一变化。一个进程有可能调用</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数关闭一个复制的套接口描述字,于是该描述字就被清除了,然而,底层的套接口并不会被关闭,底层的套接口将一直保持打开,直到最后的一个套接口描述字被关闭。</P>
<P ALIGN="JUSTIFY">	选择对共享套接口的通知可以使用</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>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>接收</FONT><FONT SIZE=3>FD_READ</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>事件,进程</FONT><FONT SIZE=3>B</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>接收</FONT><FONT SIZE=3>FD_WRITE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>事件,这是做不到的。如果应用程序确实需要使用这种紧密的协调方式,我们建议应用程序开发者使用线程而不要使用进程。</P></FONT></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -