?? 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 + -