Windows程序間通訊之命名管道

2021-05-27 10:01:37 字數 2681 閱讀 2650

命名管道是通過網路來完成程序間的通訊,它遮蔽了底層的網路協議細節。我們在不了解網路協議的情況下,也可以利用命名管道來實現程序間的通訊。與socket網路通訊相比,命名管道不再需要編寫身份驗證的**。將命名管道作為一種網路程式設計方案時,它實際上建立了乙個c/s通訊體系,並在其中可靠的傳輸資料。命名管道伺服器和客戶機的區別在於:伺服器是唯一乙個有權建立命名管道的程序,也只有它能接受管道客戶機的連線請求。而客戶機只能同乙個現成的命名管道伺服器建立連線。命名管道伺服器只能在windowsnt或windows2000上建立,不過可以是客戶機。命名管道提供了兩種基本通訊模式,位元組模式和訊息模式。在位元組模式中,資料以乙個連續的位元組流的形式在客戶機和伺服器之間流動。而在訊息模式中,客戶機和伺服器則通過一系列不連續的資料單位進行資料的收發,每次在管道上發出一條訊息後,它必須作為一條完整的訊息讀入。

建立乙個命名管道:

handle winapi createnamedpipe(

__in          lpctstr lpname,       //管道名稱

__in          dword dwopenmode,  //管道訪問方式

__in          dword dwpipemode,   //管道模式

__in          dword nmaxinstances,

__in          dword noutbuffersize,

__in          dword ninbuffersize,

__in          dword ndefaulttimeout,

__in          lpsecurity_attributes lpsecurityattributes

);

建立乙個命名管道的例項,並返回其控制代碼。

建立例項成功後,等待客戶端程序:

bool winapi connectnamedpipe(

__in          handle hnamedpipe,

);

注意此函式返回值的判斷,當返回值為0時不一定就表示失敗,應該繼續判斷返回值是否為error_io_pending,如果是不表示失敗了。

handle winapi createevent(

__in          lpsecurity_attributes lpeventattributes,

__in          bool bmanualreset,

__in          bool binitialstate,

__in          lpctstr lpname

);

此結構體只需設定第五個引數。

然後呼叫函式:

dword waitforsingleobject(

handle hhandle,

dword dwmilliseconds

);

用來等待我們這個事件物件變為有訊號狀態。

客戶端編寫:

建構函式來對控制代碼初始化,析構函式關閉控制代碼。

在連線之前首先判斷是否存在有可利用的命名管道例項:

bool winapi waitnamedpipe(

__in          lpctstr lpnamedpipename,

__in          dword ntimeout

);

如果存在,再用createfile()開啟乙個管道。

程式例項:

伺服器端:

void cnamedpipesrvview::onpipecreate()

hpipe=createfile("

\\\\.\\pipe\\mypipe",generic_read

| generic_write,0,null,open_existing,file_attribute_normal,null);

if(invalid_handle_value ==hpipe)}

windows程序間通訊

摘 要 隨著人們對應用程式的要求越來越高,單程序應用在許多場合已不能滿足人們的要求。編寫多程序 多執行緒程式成為現代程式設計的乙個重要特點,在多程序程式設計中,程序間的通訊是不可避免的。microsoft win32 api 提供了多種程序間通訊的方法,全面地闡述了這些方法的特點,並加以比較和分析,...

Linux 程序間通訊之命名管道

1 命名管道 建立命名管道 1 命令列方法 mkfifo filename 2 程式裡建立 int mkfifo const char filename,mode t mode int main 匿名管道與命名管道的區別命名管道的開啟規則命名管道實現檔案拷貝讀原始檔,寫入命名管道 include i...

程序間通訊 命名管道

程序間通訊的本質是不同的程序看到了同乙份公共的資源。而管道的 乙個不 足之處是沒有名字,因此,只能 用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供 乙個路徑名與之關聯,以fifo的 檔案形式儲存於 檔案系統中。命名...