代码相关出处:《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;
}