郵槽是Windows作業系統提供的一種單向進程間通信機制,可用於單機或者網路上的多機分散式環境。對於相對簡短的低頻率信息傳送,使用郵槽通常比命名管道或Unix域套接字更簡單。如低頻率的狀態改變訊息、作為對等點發現協定(peer-discovery protocol)的一部分。 郵槽機制允許短報文廣播給域上的計算機中所有監聽的進程。
基本介紹
- 中文名:郵槽
- 外文名:MailSlot
簡介
套用
- MAILSLOT\Messngr - 微軟NET SEND協定
- MAILSLOT\Browse - 微軟網路鄰居共享資源瀏覽服務
- MAILSLOT\Alerter
- MAILSLOT\53cb31a0\UnimodemNotifyTSP
- MAILSLOT\HydraLsServer - Microsoft Terminal Services Licensing
- MAILSLOT\CheyenneDS -CABrightStor Discovery Service
實現
郵槽命名
郵槽報文內容
創建郵槽
寫入報文到郵槽
讀取郵槽報文
//郵槽伺服器,負責創建郵槽,讀取郵槽#include <windows.h>#include <stdio.h>int main(){ HANDLE Mailslot; char buffer[256]; DWORD NumberOfBytesRead; //Create the mailslot Mailslot = CreateMailslot("////.//Mailslot//Myslot", //指定郵槽的名字 0, //可寫入郵槽的訊息的最大位元組長度;為0表示接收任意長度訊息 MAILSLOT_WAIT_FOREVER, //等待或不等待,單位毫秒,MAILSLOT_WAIT_FOREVER無限期等待,0立即返回 NULL); //訪問控制許可權,一般為NULL if (INVALID_HANDLE_VALUE == Mailslot) { printf("Failed to create a mailslot %d/n", GetLastError()); return -1; } //Read data from the mailslot forever! while (0 != ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead, NULL)) { printf("%.*s/n",NumberOfBytesRead,buffer); } CloseHandle(Mailslot); return 0;}
//郵槽客戶端,用於傳送數據到郵槽伺服器#include <windows.h>#include <stdio.h>int main(int argc, char *argv[]){ HANDLE Mailslot; DWORD BytesWritten; CHAR ServerName[256]; //從命令行接受要傳送數據到的伺服器名 if (argc < 2) { printf("Usage: client <server name>/n"); return -1; } sprintf(ServerName, "////%s//Mailslot//Myslot",argv[1]); Mailslot = CreateFile(ServerName, //郵槽名字 GENERIC_WRITE, //必須為GENERIC_WRITE,因為客戶端只能向郵槽寫入數據 FILE_SHARE_READ, /必須為FILE_SHARE_READ,因為郵槽伺服器需要做打開和讀操作 NULL, OPEN_EXISTING, //郵槽在本地且還沒有創建郵槽則當前調用失敗;郵槽在遠程,該參數無意義 FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == Mailslot) { printf("WriteFile failed with error %d/n",GetLastError()); return -1; } if(0 == WriteFile(Mailslot, "This is a test", 14, &BytesWritten,NULL)) { printf("WriteFile failed with error %d/n", GetLastError()); return -1; } printf("Wrote %d byteds/n", BytesWritten); CloseHandle(Mailslot); return 0;}