windows程式設計之命名管道通訊

2021-07-14 16:53:02 字數 2769 閱讀 1501

管道分為兩種,一種是匿名管道,一種是命名管道。兩者都可以進行程序間的通訊,但匿名管道有侷限性,它只能在本機上使用,而不能跨網路使用。但是命名管道就不一樣了,它彌補了匿名管道的侷限性。接下來看下,如何在windows平台下,進行命名管道的通訊。

首先,要進行兩個進行間的通訊,必須要有乙個程序主動一點,來建立乙個命名的管道,呼叫createnamedpipe即可建立乙個命名的管道,其宣告如下:

handle createnamedpipe(

lpctstr lpname, // 管道名稱,形式必須為\\.\pipe\pipename

dword dwopenmode, // 開啟管道的模式

dword dwpipemode, // 管道的模式,傳輸資料的形式

dword nmaxinstances, // 最大連線客戶端的個數

dword noutbuffersize, // 輸出緩衝區的大小

dword ninbuffersize, // 輸入緩衝區的大小

dword ndefaulttimeout, // 預設的超時時間

lpsecurity_attributes lpsecurityattributes // 安全屬性,一般為null

);

bool connectnamedpipe(  

handle hnamedpipe, // 命名管道物件

);

客戶端連線之後,兩者之間就可以 進行通訊了,通訊的操作跟我們的檔案操作是一樣的,通過readfile和writefile來進行讀和寫。

通訊完之後呢,我們可以呼叫disconnectnamedpipe來進行斷開連線,其宣告如下:

bool disconnectnamedpipe(  

handle hnamedpipe // 命名管道物件

);

以下是服務端的測試**:

#include #include int main(int argc, char ** argv)

else

//非同步io結構

//建立乙個事件核心物件

op.hevent = createevent(null, true, false, null);

//等待乙個客戶端進行連線

bool b = connectnamedpipe(hnamedpipe, &op);

//當有客戶端進行連線時,事件變成有訊號的狀態

if (waitforsingleobject(op.hevent, infinite) == 0)

else

//連線成功後,進行通訊,讀寫

char buff[100];

sprintf_s(buff, 100, "test message from server!");

dword cbwrite;

writefile(hnamedpipe, buff, strlen(buff), &cbwrite, null);

zeromemory(buff, 100);

readfile(hnamedpipe, buff, 100, &cbwrite, null);

//通訊完之後,斷開連線

disconnectnamedpipe(hnamedpipe);

//關閉管道

closehandle(hnamedpipe);

system("pause");

return 0;

}

當服務端將管道建立好了之後,客戶端就不需要再次建立管道了,客戶端只需要連線管道即可,但在連線之前,我們應該呼叫waitnamedpipe來檢查一下,命名管道是否存在,其宣告如下:

bool waitnamedpipe(  

lpctstr lpnamedpipename, // 管道名稱,形式必須為\\.\pipe\pipename

dword ntimeout // 超時時間,給null為預設的超時時間

);

當檢查到命名管道存在了且可用,我們就可以連線管道,連線管道很簡單,就是呼叫createfile來開啟命名管道。開啟之後就可以進行通訊了,就是一些檔案操作,

以下是客戶端的測試**:

#include #include int main(int argc, char ** argv)

else

//進行通訊

char buf[100];

zeromemory(buf, 100);

dword dwread;

readfile(hfile, buf, 100, &dwread, null);

printf(buf);

writefile(hfile, "test message for client!", strlen("test message for client!"), &dwread, null);

//關閉管道

closehandle(hfile);

system("pause");

return 0;

}

windows 通訊之命名管道

client 等待例項化 建立管道 發收資料 關閉會話 include pch.h include include include includeusing namespace std void main handle hpipe createfile l pipe test generic rea...

作業系統實驗(15 16)匿名管道與命名管道通訊

include include include include include intmain printf pipe create success n if fork 0 else close pipe fd 0 close pipe fd 1 return0 分析 父程序通過pipe 呼叫申請建...

Windows程序間通訊之命名管道

命名管道是通過網路來完成程序間的通訊,它遮蔽了底層的網路協議細節。我們在不了解網路協議的情況下,也可以利用命名管道來實現程序間的通訊。與socket網路通訊相比,命名管道不再需要編寫身份驗證的 將命名管道作為一種網路程式設計方案時,它實際上建立了乙個c s通訊體系,並在其中可靠的傳輸資料。命名管道伺...