1. 程式人生 > 其它 >程序間通訊(6) 郵槽

程序間通訊(6) 郵槽

技術標籤:作業系統相關

  • 郵槽是基於廣播通訊體系設計出來的,它採用無連線的不可靠的資料傳輸。
  • 郵槽是一種單向通訊機制,建立郵槽的伺服器程序讀取資料,開啟郵槽的客戶端寫入資料。
  • 郵槽可以實現一對多的單向通訊。但是資料量小,通常都是424位元組以下。假設client1先send,client2再send,最後server可以連續receive兩次
  • 如果是網路通訊,server的名稱寫".",client寫伺服器電腦名或ip地址

1. 過程

a. server 先CreateMailslot
b. client 再CreateFile連線之前的mailSlot
c. client writeFile

d. server readFile

2.該函式利用指定的名稱來建立一個郵槽,然後返回所建立的郵槽的控制代碼。

HANDLE    WINAPI   CreateMailslot(
        __in          LPCTSTR lpName,
        __in          DWORD nMaxMessageSize,
        __in          DWORD lReadTimeout,
        __in_opt      LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
  • 引數 lpName
    指定了將要建立的郵槽的名稱,該名稱的格式必須為 \.\mailslot\MailslotName。

    在這裡需要注意的是兩個斜槓後的那個 “.”,在這裡使用圓點代表的是本地機器,

  • 引數 nMaxMessageSize
    用來指定可以被寫入到郵槽的單一訊息的最大尺寸,為了可以傳送任意大小的訊息,需要將該引數設定為 0 。

  • 引數 lReadTimeOut
    指定讀取操作的超時時間間隔,以毫秒作為單位。
    讀取操作在超時之前可以等待一個訊息被寫入到郵槽中,如果將這個值設定為 0 ,那麼若沒有訊息可用的話,該函式將立即返回。如果將該值設定為 MAILSLOT_WAIT_FOREVER,則該函式會一直等待,直到有訊息可用。

  • 引數 lpSecurityAttributes
    一般設定為 NULL 即可,即採用 Windows 預設的針對於郵槽的安全性。

3. code

server:

  HANDLE hMailslot;
	hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,
		MAILSLOT_WAIT_FOREVER,NULL);
	if(INVALID_HANDLE_VALUE==hMailslot)
	{
		MessageBox("建立郵槽失敗!");
		return;
	}
	char buf[100];
	DWORD dwRead;
	if(!ReadFile(hMailslot,buf,100,&dwRead,NULL))
	{
		MessageBox("讀取資料失敗!");
		CloseHandle(hMailslot);
		return;
	}
	MessageBox(buf);
	CloseHandle(hMailslot);	

client

HANDLE hMailslot;
	hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,
		FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(INVALID_HANDLE_VALUE==hMailslot)
	{
		MessageBox("開啟郵槽失敗!");
		return;
	}
	char buf[]="http://www.sunxin.org";
	DWORD dwWrite;
	if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL))
	{
		MessageBox("寫入資料失敗!");
		CloseHandle(hMailslot);
		return;
	}
	CloseHandle(hMailslot);	

【引用】

  1. 程式碼 https://github.com/thefistlei/os/tree/main/processCommunication/mailSlot
  2. VC++ 深入詳解 孫鑫