进程通信之邮槽

1.创建邮槽 服务器

// InterProcess_Communication_MAILSLOT_SERVER.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <locale.h>
#include <iostream>
using namespace std;
#define SLOT_NAME L"\\\\.\\mailslot\\my_slot"

int _tmain(int argc, _TCHAR* argv[])
{
	//设置中文环境
	setlocale(LC_ALL,"chs");

	//邮槽的格式 \\.\mailslot\\myslot
	//参见MSDN 说明https://msdn.microsoft.com/en-us/library/windows/desktop/aa365147(v=vs.85).aspx
	HANDLE hSlot = CreateMailslot(
		SLOT_NAME,
		0,
		MAILSLOT_WAIT_FOREVER,
		NULL
		);
	if(hSlot == INVALID_HANDLE_VALUE)
	{
		wcout<<L"CreateMailslot failed!\n";
		return 0;
	}
	else 
		wcout << L"CreateMailslot success!\n";

	DWORD dwMsgCount = 0,dwMsgSize = 0;
	while(true)
	{

		GetMailslotInfo(hSlot,
						NULL,
						&dwMsgSize,
						&dwMsgCount,
						NULL
						);
		if(dwMsgSize == MAILSLOT_NO_MESSAGE)
		{
			Sleep(2000);
			continue;
		}

		while(dwMsgCount)
		{
			WCHAR* lpBuffer;
			lpBuffer =(WCHAR*) new CHAR[dwMsgSize + 2];
			DWORD dwRet;
			memset((CHAR*)lpBuffer,0,dwMsgSize + 2);
			if(!ReadFile(hSlot,lpBuffer,dwMsgSize + 2,&dwRet,NULL))
			{
				wcout << L"READFILE函数执行失败\n";
				delete[] lpBuffer;
				return 0;
			}
			
			wcout << lpBuffer<<endl;
			GetMailslotInfo(hSlot,(LPDWORD)NULL,&dwMsgSize,&dwMsgCount,NULL);
			delete[] lpBuffer;
		}
	}
	return 0;
}


2.创建右键客户端

// InterProcess_Communication_MAILSLOT_CLIENT.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <locale.h>
#include <iostream>
using namespace std;

#define SLOT_NAME L"\\\\.\\mailslot\\my_slot"
#define MESSAGE_MAX_SIZE 1024*4

int _tmain(int argc,_TCHAR* argv[])
{
	setlocale(LC_ALL,"chs");
	HANDLE hFile = CreateFile(
		SLOT_NAME,
		GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
		);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		wcout << L"获取邮槽服务器失败,请确认服务器已经开启!" << endl;
		return 0;
	}
	wcout << L"连接到邮槽服务器,请输入发送数据!" << endl;
	while(true)
	{
		DWORD dwWritten;
		WCHAR lpMessage[MESSAGE_MAX_SIZE] = {0};
		wcin.getline(lpMessage,MESSAGE_MAX_SIZE);
		DWORD  dwMegLen = wcslen(lpMessage) * sizeof(TCHAR);
		if(WriteFile(hFile,lpMessage,dwMegLen,&dwWritten,NULL))
			wcout<<L"已经向邮槽写入信息!\n";
		else
			wcout << L"向邮槽写入信息失败!\n";
		Sleep(1000);
	}


	CloseHandle(hFile);
	return 0;
}



实验截图







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值