命名管道和油槽

2022-08-19 05:42:08 字數 2998 閱讀 3576

我們接著簡紹2種程序間通訊的方法:

3.命名管道:

命名管道可以再2個任意程序間通訊(包括網路上的2個不同主機之上的程序) 他們建立了如客戶機/伺服器的連線

建立命名通道的機器為伺服器 連線命名通道的機器為客戶機

在命名管道的使用中 我們會使用事件物件來標識管道的連線和讀寫操作

下面是要用到的函式:(有關詳細簡紹可以看msdn)

這個函式用來建立乙個命名管道 失敗則返回invalid_handle_value 成功返回管道控制代碼

handle createnamedpipe(

lpctstr lpname,                             // pipe name

dword dwopenmode,                           // pipe open mode

dword dwpipemode,                           // pipe-specific modes//

dword nmaxinstances,                        // maximum number of instances

dword noutbuffersize,                       // output buffer size

dword ninbuffersize,                        // input buffer size

dword ndefaulttimeout,                      // time-out interval

lpsecurity_attributes lpsecurityattributes  // sd

);這個函式用來連線命名管道(客戶機使用)

bool waitnamedpipe(

lpctstr lpnamedpipename,  // pipe name

dword ntimeout            // time-out interval

);大致流程如下:

connectnamedpipe等待連線------->呼叫waitforsingleobject函式等待事件物件發生

handle hevent;

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

if (!hevent)

-----------------------------------------客戶機連線到命名管道

if(!waitnamedpipe("////.//pipe//mypipe",nmpwait_use_default_wait))

hpipe=createfile("////.//pipe//mypipe",

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

if ( invalid_handle_value==hpipe)

--------------------------------------------讀檔案

char buf[100];

dword dwread;//實際讀取資料數目

//讀取資料

if (!readfile(hpipe,buf,100,&dwread,null))

messagebox(buf);

---------------------------------------------寫檔案

char buf="客戶端寫入資料";

dword dwwrite;//實際寫入的資料量

//寫入資料

if (!writefile(hpipe,buf,strlen(buf)+1,&dwwrite,null))

4.油槽

也可以像命名管道一樣用於任意程序間通訊 但要注意的是 油槽的建立者程序只能從油槽中讀取資料 使用者程序只能寫入資料

如果要實現雙向通訊 只需要建立2個油槽 油槽是基於廣播通訊的 這樣我們可以用很少的**實現廣播  實現1對多的單向通訊 才用socket編碼則較為複雜 缺點是傳送資料量較

少 訊息大小為424位元組以下

油槽建立比較簡單,下面是源**:

////////////////////////////////////////////建立油槽 建立者進城 讀取資料

handle hmailslot;

hmailslot=createmailslot("////.//mailslot//mymalislot",

0,mailslot_wait_forever,null);

if (invalid_handle_value==hmailslot)

char buf[100];

dword dwread;//實際讀取資料數目

//讀取資料

if (!readfile(hmailslot,buf,100,&dwread,null))

messagebox(buf);

closehandle(hmailslot);

//////////////////////////////////////////使用者程序  寫入資料

handle hmailslot;

hmailslot=createfile("////.//mailslot//mymalislot",generic_write,

file_share_read,null,open_existing,file_attribute_normal,null);

if (hmailslot==invalid_handle_value)

char buf="油槽寫入資料";

dword dwwrite;//實際寫入的資料量

//寫入資料

if (!writefile(hmailslot,buf,strlen(buf)+1,&dwwrite,null))

createfile writefile readfile可以用來建立,讀取檔案 也能用來建立,讀取油槽 命名管道等 見msdn

命名管道和油槽

我們接著簡紹2種程序間通訊的方法 3.命名管道 命名管道可以再2個任意程序間通訊 包括網路上的2個不同主機之上的程序 他們建立了如客戶機 伺服器的連線 建立命名通道的機器為伺服器 連線命名通道的機器為客戶機 在命名管道的使用中 我們會使用事件物件來標識管道的連線和讀寫操作 下面是要用到的函式 有關詳...

普通管道和命名管道

2116 0 管道分為普通管道和命名管道 兩者都是半雙工的。普通管道只能用於父子程序或兄弟程序間的通訊,因為普通管道通過fork呼叫來拷貝檔案描述符的,在檔案系統中,普通管道並不對應物理檔案。命名管道在檔案系統中有物理檔案存在,因此可以用於非親屬的程序間通訊。include int pipe int...

命名管道和匿名管道

我們知道程序間是可以通訊的。可以達到資料傳輸 資源共享 事件通知 程序控制等目的。程序間通訊主要包括管道 系統ipc,套接字等。管道分為三種 1 普通管道 int pipe int fds 2 返回值0表示成功,1表示失敗 fd 0 讀 fd 1 寫 子程序往管道中寫資料,寫資料時要關閉讀端 父程序...