// 07 邮槽-服务端.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HANDLE hSlot = CreateMailslot(L"\\.\mailslot\mail", 0, MAILSLOT_WAIT_FOREVER, // 无超时 (LPSECURITY_ATTRIBUTES)NULL); // 安全属性 while (true) { // 2.1 获取邮槽消息数量 DWORD dwMsgCount = 0, dwMsgSize = 0; GetMailslotInfo( /* 获取邮槽信息 */ hSlot, // 邮槽句柄 (LPDWORD)NULL,// 无最大消息限制 &dwMsgSize, // 下一条消息的大小 &dwMsgCount, // 消息的数量 (LPDWORD)NULL);// 无时限 if (dwMsgSize == MAILSLOT_NO_MESSAGE) { Sleep(2000); continue; } else { // 2.2 循环获取全部消息(有可能不只一条) while (dwMsgCount) { PBYTE lpBuffer; lpBuffer = new BYTE[dwMsgSize + 0x10]; // 读取邮槽中的信息 DWORD dwRet; ZeroMemory(lpBuffer, dwMsgSize); if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL)) { printf("ReadFile函数执行失败,错误码:%d. ", GetLastError()); delete[] lpBuffer; return 0; } // 显示信息 printf("邮槽的内容: %s ", lpBuffer); // 计算剩余的消息数 GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr); delete[] lpBuffer; dwMsgCount--; } } } return 0; }
// 07 邮槽-客户端.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HANDLE hMail = CreateFile(L"\\.\mailslot\mail", GENERIC_WRITE, // 读写属性 FILE_SHARE_READ, // 共享属性 NULL, // 安全属性 OPEN_EXISTING, // 打开方式 FILE_ATTRIBUTE_NORMAL, // 标志位 NULL); // 文件模板(默认留空) DWORD dwSize = 0; WriteFile(hMail, "Hello", 12, &dwSize, NULL); CloseHandle(hMail); return 0; }