?第4章命名管道
?
?“命名管道”或“命名管線”(Named Pipes )是一種簡單的進程間通信( I P C)機制,?命名管道可在同一臺計算機的不同進程之間,或在跨越一個網絡的
不同計算機的不同進程之間,支持可靠的、單向或雙向的數據通信。
要記住的一個重點是,將命名管道作為一種網絡編程方案使用時,它實際上建立一個簡單的客戶機/服務器數據通信體系,可在其中可靠地傳輸數據。
4.1.1 命名管道命名規范命名管道的標識是采用U N C格式進行的:
\ \ s e r v e r \ P i p e \ [ p a t h ] n a m e
上述字串可分為三部分來觀看: \ \ s e r v e r、\ P i p e和\ [ p a t h ] n a m e。第一部分\ \ s e r v e r指定一個服務器的名字。命名管道便是在那個服務器上創建的,而且要由它對進入的連接請求進行“監聽”。第二部分\ P i p e是一個不可變化的“硬編碼”字串(必須原樣照錄,但不用區分大小寫),用于指出該文件從屬于N P F S。而第三部分\ [ p a t h ] n a m e則使應用程序可以“唯一”定義
及標定一個命名管道的名字,而且可在這里設置多級目錄。
4.1.2 字節模式及消息模式
命名管道提供了兩種基本通信模式:字節模式和消息模式。
命名管道服務器應用只能在Windows NT或Windows 2000上工作——Windows 95和Windows 98 不允許應用程序創建命名管道!
4.2.2 高級服務器的細節
在前面的程序清單4 - 1中,我們展示了如何設計一個命名管道服務器應用,令其只負責對一個管道實例的控制。所有A P I調用都采用同步模式工作。在這種模式下,每個調用都會一直等到I / O請求完成,才會返回。命名管道服務器也能擁有多個管道實例,所以客戶機能夠建立
同服務器的兩個或更多的連接;管道實例的數量要受到C r e a t e N a m e d P i p e這個A P I調用之n M a x I n s t a n c e s參數指定的數字的限制。要想同時控制不止一個的管道實例,服務器必須考慮使用多個線程,或者使用異步Win32 I/O機制(比如重疊式I / O以及完成端口等),分別為每個管道實例提供服務。
采用異步I / O機制,服務器可從單獨一個應用程序線程中,同時為所有管
道實例提供服務。在此,我們將解釋如何使用線程以及重疊式I / O,來開發更高級的服務器應用。
1 . 線程
要想開發一個高級服務器,令其使用線程,同時支持多個管道實例,整個過程是非常簡單的。我們要做的唯一事情便是為每個管道實例都創建一個線程.
2. 重疊式I / O
重疊式I / O是一種特殊的輸入/輸出機制,允許Win32 API函數(如R e a d F i l e和Wr i t e F i l e)在發出I / O請求之后,以異步方式工作。具體的工作原理是:向這些A P I函數傳遞一個O V E R L A P P E D
(重疊式)結構,然后使用A P I函數G e t O v e r l a p p e d R e s u l t,從原來那個O V E R L A P P E D結構中,取得一次I / O請求的結果。如果在使用重疊式結構的前提下,調用一個Win32 API函數,那么調用無論如何都會立即返回!
3. 安全模擬
之所以會選擇命名管道作為自己的網絡編程方案,一個最好的理由便是它們依賴于Windows NT及Windows 2000的安全機制,Windows NT和Windows 2000安全機制具有“模擬”能力,允許一個命名管道服務器
應用在客戶機的安全環境中執行。執行一個命名管道服務器應用時,它通常會在用于啟動該應用的那個進程的安全環境許可級別上工作。例如,假如擁有管理員權限的某人啟動了一個命名管道服務器,服務器便有權訪問Windows NT或Windows 2000系統上的幾乎任何資源。此時,假如在C r e a t e N a m e d P i p e中指定的S E C U R I T Y _ D E S C R I P TO R結構允許所有用戶訪問這個
命名管道,就會埋下極大的安全隱患。
4.5 小結
本章向大家介紹了命名管道網絡編程技術,它為我們建立了一個簡單的客戶機/服務器數據通信體系,可確保數據進行可靠傳輸。接口依賴于Wi n d o w s重定向器,以便通過一個網絡來傳送數據。對命令管道而言,它最大的一項好處便是直接利用了Windows NT及Wi n d o w s2 0 0 0的安全機制,該機制是本書講到的其他網絡技術均不具備的一項好處!下面第二部分將向大家深入講解Wi n s o c k技術,以便應用程序利用一種網絡傳輸協議,進行“直接”通信。