管道分為兩種,一種是匿名管道,一種是命名管道。兩者都可以進行程序間的通訊,但匿名管道有侷限性,它只能在本機上使用,而不能跨網路使用。但是命名管道就不一樣了,它彌補了匿名管道的侷限性。接下來看下,如何在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通訊體系,並在其中可靠的傳輸資料。命名管道伺...