进程间通信——— 油槽(Mailslot)

/*邮槽(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);
}
原文地址:https://www.cnblogs.com/yifi/p/6596576.html