进程通信+邮槽【C++】

邮槽

利用MFC创建两个工程,分为客户端和服务端。
邮槽只能单向通信,一方接收数据,一方发送数据。
服务端创建好邮槽的文件,等待接收数据;客户端向对应的文件中发送数据。

服务端代码:

CreateMailslot 函数用于创建一个邮槽(Mailslot),参数解释:

szSlotName: 邮槽的名称。这是一个字符串,指定了要创建的邮槽的名称。邮槽名通常以\\.\mailslot\ 开头。

0: 最大消息大小。这里设置为0,表示可以接收任意长度的消息。

MAILSLOT_WAIT_FOREVER: 读取消息的超时时间。这里设置为 MAILSLOT_WAIT_FOREVER,表示读操作将永不超时,即永远等待直到有消息到来。

NULL: 安全属性。传递 NULL 表示使用默认的安全描述符。

函数返回一个 HANDLE,这是一个句柄,用于后续对邮槽的操作。如果函数调用成功,返回的句柄可以用于读取从邮槽发送过来的消息。如果函数调用失败,返回值为INVALID_HANDLE_VALUE。在邮槽不再需要时,应使用 CloseHandle 函数关闭句柄,以释放资源。

void CProcessCommunitDlg::OnBnClickedButtonRecv()
{
	// TODO: 在此添加控件通知处理程序代码
	
	//创建邮槽
	LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\myMailSlot");                                                                       
	HANDLE hSlot = CreateMailslot(szSlotName,//邮槽名字
		0,//最大的消息大小
		MAILSLOT_WAIT_FOREVER,//永远等待创建成功
		NULL);//安全属性
	if (hSlot == INVALID_HANDLE_VALUE)
	{
		TRACE("CreatMailSlot failed with %d\n", GetLastError());
		return;
	}

	//读取数据
	char szBuf[100] = {0};
	DWORD dwRead;
	//把接收到的数据存在szBuf中,数据大小存在dwRead中
	if (!ReadFile(hSlot, szBuf, 100, &dwRead, NULL))
	{
		MessageBox("read Failed!!!");
		return;
	}
	//显示数据
	TRACE("####dwRead = %d", dwRead);//显示接收到的数据大小
	MessageBox(szBuf);//窗口显示数据
	CloseHandle(hSlot);
}

CreateFile 函数通常用于打开或创建文件、设备、文件系统对象(如邮槽Mailslot)等。

CreateFile 函数参数的详细解释:

szSlotName: 邮槽的名称。这是一个字符串,指定了要打开的邮槽的名称。

FILE_GENERIC_WRITE: 访问模式。这里指定了对文件的写访问权限。

FILE_SHARE_READ: 共享模式。这里允许其他进程对邮槽进行读访问。

NULL: 安全属性。这里传递 NULL 表示使用默认的安全描述符。

OPEN_EXISTING: 创建方式。这里指定只打开已存在的邮槽。如果邮槽不存在,函数将失败。

FILE_ATTRIBUTE_NORMAL: 文件属性。这里指定文件属性为普通。

NULL: 模板文件的句柄。用于复制文件属性,这里不使用,故设为 NULL。

函数返回一个 HANDLE,这是一个句柄,用于后续对邮槽的操作。如果函数调用失败,返回值为 INVALID_HANDLE_VALUE。在使用完毕后,应使用 CloseHandle 函数关闭句柄,以释放资源。

客户端代码:

void CProcessClientDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	
	//创建邮槽的文件句柄,邮槽名字与服务器的必须相同
	LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\MyMailSlot");                       

	HANDLE hMailSlot = CreateFile(szSlotName,//邮槽名字
		FILE_GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,//打开已存在的文件
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if(hMailSlot == INVALID_HANDLE_VALUE)
	{
		TRACE("create file failed with %d\n", GetLastError());
		return;
	}

	//写入数据
	char szBuf[100] = "i am mail slot client!";
	DWORD dwWrite;

	if (!WriteFile(hMailSlot, szBuf, strlen(szBuf)+1, &dwWrite, NULL))
	{
		MessageBox("write Failed!!!");
		return;
	}

	CloseHandle(hMailSlot);
}

服务端点击接收按钮,等待接收数据。
在这里插入图片描述
客户端点击发送按钮,把写好的数据发送出去。
在这里插入图片描述
服务端收到了数据,并用窗口显示出来。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值