代码相关出处:《Windows网络编程技术》第3章 邮槽
邮槽为轻量级进程间通信应用。邮槽使用方便。
邮槽使用的缺点有如下两点。
邮槽服务端代码,IPCServer.cpp文件如下。
// IPCServer.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Windows.h> #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { HANDLE Mailslot; char buffer[256]; DWORD NumberOfBytesRead; //Create the mailslot //邮槽名中.表示本机为服务器 Mailslot = CreateMailslot(_T("\\\\.\\Mailslot\\Myslot"), 0, MAILSLOT_WAIT_FOREVER, NULL); if (Mailslot == INVALID_HANDLE_VALUE) { printf("Failed to create a mailslot %d\n", GetLastError()); return 0; } //ReadFile会一直等待,直到接受到信息 while (ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead, NULL) != 0) { printf("%.*s\n", NumberOfBytesRead, buffer); } return 0; }
邮槽客户端代码,IPCClient.cpp文件如下。
// IPCClient.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Windows.h> #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { HANDLE Mailslot; DWORD BytesWritten; /* \\\\.\\Mailslot\\Myslot说明本机既是服务器又是客户端 客户端与服务端分离时,可写为\\\\服务器名称\\Mailslot\\Myslot CreateFile:可打开和创建文件、管道、邮槽、通信服务、设备以及控制台缓冲区 */ Mailslot = CreateFile(_T("\\\\.\\Mailslot\\Myslot"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (Mailslot == INVALID_HANDLE_VALUE) { printf("CreateFile failed with error %d\n", GetLastError()); return 0; } if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten, NULL) == 0) { printf("WriteFile failed with error %d\n", GetLastError()); return 0; } printf("Wrote %d bytes.\n", BytesWritten); CloseHandle(Mailslot); return 0; }