/*邮槽(Mailslot)也称为邮件槽,其是 Windows 提供的一种用来实现进程间通信的手段, 其提供的是基于不可靠的,并且是单向数据传输的服务。 邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据, 何为服务端?何为客户端? 服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。 还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数据的长度 < 425 字节时, 才可以被广播给多个服务器,如果消息的长度 > 425 字节的话,那么在这种情形下, 邮槽是不支持广播通信的。*/
#include "stdafx.h" #include "MailslotClient.h" CMailslotClient::CMailslotClient() { } CMailslotClient::~CMailslotClient() { } void CMailslotClient::OnSend(char* szBuffer) { HANDLE SendMailSlotHandle; DWORD dwWrite; //打开由服务端创建的邮件槽 SendMailSlotHandle = CreateFile(TEXT("\\.\mailslot\YIFIMailSlot"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == SendMailSlotHandle) { MessageBox(NULL,TEXT("打开邮槽失败 ..."), TEXT("提示"), MB_ICONERROR); return; } //通过邮件槽向服务端发送数据 if (!WriteFile(SendMailSlotHandle, szBuffer, strlen(szBuffer), &dwWrite, NULL)) { MessageBox(NULL,TEXT("写入数据失败 ..."), TEXT("提示"), MB_ICONERROR); CloseHandle(SendMailSlotHandle); return; } MessageBox(NULL,TEXT("写入数据成功 ..."), TEXT("提示"), MB_ICONINFORMATION); }
#include <cstdio> #include "Mailslot.h" char* StrRecvData; CMailslot::CMailslot() { StrRecvData = new char[maxDataLen]; memset(StrRecvData, 0, maxDataLen); } CMailslot::~CMailslot() { } //接收按钮的消息处理 void CMailslot::OnRecv() { DWORD ReadLength; //创建接收数据的线程,将邮槽句柄传递给线程 CreateRecvThread((LPVOID)MailslotHandle, 0, NULL); } //线程处理函数 DWORD WINAPI RecvThreadProc(LPVOID lpPrameter) { HANDLE hRecvMailSlot; DWORD dwRead; hRecvMailSlot = (HANDLE)lpPrameter; //利用传进来的邮槽句柄接收收据,并将数据存放到 pStrRecvData 中 ReadFile(hRecvMailSlot, StrRecvData, maxDataLen, &dwRead, NULL); int a = GetLastError(); printf("%s %d ", StrRecvData,a); //关闭邮槽 CloseHandle(hRecvMailSlot); return NULL; } void CMailslot::OnCreate() { //创建名为 ZacharyMailSlot 的邮槽 MailslotHandle = CreateMailslot(TEXT("\\.\mailslot\YIFIMailSlot"), 0,MAILSLOT_WAIT_FOREVER, NULL); if (INVALID_HANDLE_VALUE == this->MailslotHandle) { MessageBox(NULL,TEXT("创建邮槽失败 ..."), TEXT("提示"), MB_ICONERROR); return; } } HANDLE CMailslot::CreateRecvThread(LPVOID lpParameter, DWORD threadFlag, LPDWORD lpThreadID) { //创建一个线程 return CreateThread(NULL, 0, RecvThreadProc, lpParameter, threadFlag, lpThreadID); }