windows进程间通讯-邮路

邮路是由邮路服务进程创建。当邮路服务进程创建了一个邮路后,便返回该邮路句柄。当某个进程需要从该邮路中读取消息时,它必须提供该句柄。只有创建该邮路的进程,或以某种机制(比如继承)获得该邮路句柄的进程能够从邮路中读取消息。与管道不同,所有的邮路都是从属于创建它的本地进程的,你无法创建一个远程的邮路。邮路的客户进程具有向邮路写入消息的权限。任何进程只要获得了邮路的名字,就可以往里面写入消息,新的消息将放在邮路的消息队列后面。
邮路能在一个域中广播消息。如果域中几个进程每个都用相同的名字创建了一个邮路,则它们都会收到送往该邮路的消息。
在邮路中传递的消息如果小于425字节,那么它们会以数据包的形式传递。大于425字节的消息会以其它的方式传输,在这种情况下,你只能从一个客户进程传递给一个服务进程,而不能从一个客户进程传递给多个服务进程。且Windows NT不支持大于等于425个字节的消息传递。

邮路由以下函数创建:
HANDLE CreateMailslot(
  LPCTSTR lpName,                            // 邮路名
  DWORD nMaxMessageSize,                     // 消息最大的大小
  DWORD lReadTimeout,                        // 读取操作的超时时间
  LPSECURITY_ATTRIBUTES lpSecurityAttributes // 描述安全信息的一个结构
);

邮路由以下函数删除:
BOOL CloseHandle(
  HANDLE hObject   // 邮路句柄
);

其它邮路函数简介如下:
GetMailslotInfo:获取指定邮路的相关信息。
SetMailslotInfo:设置指定邮路的相关信息。

下面是客户端和服务端代码:

client:

#include <windows.h>
#include <stdio.h>

#define MAILSOLT_NAME		"\\\\.\\mailslot\\MyMailSlot"
#define MAX_BUFFER_SIZE		1024

int main()
{
	HANDLE hMailSlot = nullptr;
	hMailSlot = CreateFile(MAILSOLT_NAME, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hMailSlot){
		printf("CreateFile fail:%d\n", GetLastError());
		return -1;
	}else{
		printf("CreateFile() success...\n");
	}

	char szBuffer[MAX_BUFFER_SIZE] = "client send msg";
	DWORD cbBytes = 0;
	BOOL bResult = WriteFile(hMailSlot, szBuffer, strlen(szBuffer) + 1, &cbBytes, NULL);
	if((!bResult) || (strlen(szBuffer) + 1 != cbBytes)){
		printf("WriteFile fail:%ld\n", GetLastError());
		CloseHandle(hMailSlot);
		return -1;
	}else{
		printf("WriteFile successed...\n");
	}

	CloseHandle(hMailSlot);
	hMailSlot = nullptr;

	return 0;
}

server:

#include <windows.h>
#include <stdio.h>

#define MAILSOLT_NAME		"\\\\.\\mailslot\\MyMailSlot"
#define MAX_BUFFER_SIZE  1024

int main()
{
	HANDLE hMailSlot = nullptr;
	/*HANDLE WINAPI CreateMailslot(
	_In_     LPCTSTR               lpName, //指定邮路的名字:\\.\邮路\[路径\]邮路名
	_In_     DWORD                 nMaxMessageSize, //指定一个邮路消息的最大长度。零表示无限长。请注意,对于穿越一个网络域到多个邮路的广播消息,最大长度是400
	_In_     DWORD                 lReadTimeout,  //等待指定的数据时,用这个参数指定邮路使用的默认超时设置,以毫秒为单位。零表示不等待。常数MAILSLOT_WAIT_FOREVER表示一直等到数据到达
	_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes //指定一个结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
	);*/
	hMailSlot = CreateMailslot(MAILSOLT_NAME, MAX_BUFFER_SIZE, MAILSLOT_WAIT_FOREVER, NULL);
	if (INVALID_HANDLE_VALUE == hMailSlot){
		printf("CreateMailslot fail:%d\n", GetLastError());
		return -1;
	}else{
		printf("CreateMailslot success...\n");
	}

	char szBuffer[MAX_BUFFER_SIZE] = {0};
	DWORD cbBytes = 0;
	BOOL bResult = FALSE;
	printf("Waiting for client connection...");

	while (TRUE)
	{
		bResult = ReadFile(hMailSlot, szBuffer, MAX_BUFFER_SIZE - 1, &cbBytes, NULL);
		if ((!bResult) || (0 == cbBytes)){
			printf("ReadFile fail:%d...\n",GetLastError());
			CloseHandle(hMailSlot);
			return -1;
		}
		printf("recv client msg:[%s]", szBuffer);
	}

	CloseHandle(hMailSlot);

	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值