1. 邮槽(MailSlot)是 Windows 系统中最简单的一种进程间通信方式,一个进程可以创建一个邮槽,其它进程可以通过打开此邮槽与创建邮槽的进程通讯。<br />邮槽的通讯是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入消息,消息被写入邮槽后以队列的方式保存(先入先出)。<br />邮槽除了可以在本机内进行进程间通讯外,还可以在主机间进行通讯(使用 UDP 协议),想要通过网络进行邮槽通讯,必须要知道服务端的主机名或域名。

    需要用到的函数

    API 说明
    CreateMailslot 创建一个邮槽
    GetMailslotInfo 获取邮槽信息
    CreateFile 打开文件(打开邮槽)
    WriteFile 写入文件(向邮槽写入数据)
    ReadFile 读取文件(在邮槽中读取数据)

    邮槽通信-接收端

    #include <iostream>
    #include <windows.h>
    
    
    
    int main()
    {
        // 1. 创建一个邮槽内核对象,用于进行消息的接收,由发送端向其中写入内容
        HANDLE MailSlot = CreateMailslot(
            L"\\\\.\\mailslot\\my_mailslot",            // 符合邮槽命名规范的名字
            0,                                            // 消息的最大长度,如果是 0 表示不限制
            MAILSLOT_WAIT_FOREVER,                        // 等待接收消息的时长,这里是一直等
            NULL);                                        // 安全属性
    
        // 2. 提供几个变量,用于接收消息的数量和消息的长度
        DWORD MessageCount = 0, MessageLength = 0;
    
        // 3. 编写死循环,不断的尝试从邮槽对象中读取内容
        while (TRUE)
        {
            GetMailslotInfo(
                MailSlot,                                // 邮槽对象的句柄
                NULL,                                    // 当前允许接收的最大消息数量
                &MessageLength,                            // 下一条消息的长度
                &MessageCount,                            // 邮槽中还有多少条消息
                NULL);                                    // 表示不等待(无时限)
    
            // 如果返回给我们的消息长度是 -1,就表示目前没有消息,稍后再看
            if (MessageLength == MAILSLOT_NO_MESSAGE)
            {
                Sleep(500);
                continue;
            }
    
            // 如果有内容,根据消息的实际长度,动态的分配一块堆空间并用 ReadFile 从邮槽内读取到内容
            DWORD ReadBytes = 0;
            CHAR* Buffer = new CHAR[MessageLength]{};
            ReadFile(MailSlot, Buffer, MessageLength, &ReadBytes, NULL);
    
            // 显示读取到的内容
            printf("recv: %s\n", Buffer);
            delete[] Buffer;
        }
    
    
        return 0;
    }
    

    邮槽通信-发送端

    #include <windows.h>
    
    int main()
    {
        // 使用 CreateFile 打开邮槽,当前必须保证邮槽已经创建了,否则后面的操作没有意义
        HANDLE MailSlot = CreateFileA("\\\\.\\mailslot\\my_mailslot", GENERIC_WRITE,
            FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
        // 通过 WriteFile 向邮槽内发送数据
        DWORD WriteBytes = 0;
        WriteFile(MailSlot, "hello world", 12, &WriteBytes, NULL);
    
        return 0;
    }