邮路是由邮路服务进程创建。当邮路服务进程创建了一个邮路后,便返回该邮路句柄。当某个进程需要从该邮路中读取消息时,它必须提供该句柄。只有创建该邮路的进程,或以某种机制(比如继承)获得该邮路句柄的进程能够从邮路中读取消息。与管道不同,所有的邮路都是从属于创建它的本地进程的,你无法创建一个远程的邮路。邮路的客户进程具有向邮路写入消息的权限。任何进程只要获得了邮路的名字,就可以往里面写入消息,新的消息将放在邮路的消息队列后面。
邮路能在一个域中广播消息。如果域中几个进程每个都用相同的名字创建了一个邮路,则它们都会收到送往该邮路的消息。
在邮路中传递的消息如果小于425字节,那么它们会以数据包的形式传递。大于425字节的消息会以其它的方式传输,在这种情况下,你只能从一个客户进程传递给一个服务进程,而不能从一个客户进程传递给多个服务进程。且Windows NT不支持大于等于425个字节的消息传递。

邮路由以下函数创建:
HANDLE CreateMailslot(
  LPCTSTR lpName,                            // 邮路名
  DWORD nMaxMessageSize,                     // 消息最大的大小
  DWORD lReadTimeout,                        // 读取操作的超时时间
  LPSECURITY_ATTRIBUTES lpSecurityAttributes // 描述安全信息的一个结构
);

邮路由以下函数删除:
BOOL CloseHandle(
  HANDLE hObject   // 邮路句柄
);

其它邮路函数简介如下:
GetMailslotInfo:获取指定邮路的相关信息。
SetMailslotInfo:设置指定邮路的相关信息。

下面是客户端和服务端代码:

client:

#include <windows.h>
#include <stdio.h>#define MAILSOLT_NAME       "\\\\.\\mailslot\\MyMailSlot"
#define MAX_BUFFER_SIZE     1024int main()
{HANDLE hMailSlot = nullptr;hMailSlot = CreateFile(MAILSOLT_NAME, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hMailSlot){printf("CreateFile fail:%d\n", GetLastError());return -1;}else{printf("CreateFile() success...\n");}char szBuffer[MAX_BUFFER_SIZE] = "client send msg";DWORD cbBytes = 0;BOOL bResult = WriteFile(hMailSlot, szBuffer, strlen(szBuffer) + 1, &cbBytes, NULL);if((!bResult) || (strlen(szBuffer) + 1 != cbBytes)){printf("WriteFile fail:%ld\n", GetLastError());CloseHandle(hMailSlot);return -1;}else{printf("WriteFile successed...\n");}CloseHandle(hMailSlot);hMailSlot = nullptr;return 0;
}

server:

#include <windows.h>
#include <stdio.h>#define MAILSOLT_NAME       "\\\\.\\mailslot\\MyMailSlot"
#define MAX_BUFFER_SIZE  1024int main()
{HANDLE hMailSlot = nullptr;/*HANDLE WINAPI CreateMailslot(_In_     LPCTSTR               lpName, //指定邮路的名字:\\.\邮路\[路径\]邮路名_In_     DWORD                 nMaxMessageSize, //指定一个邮路消息的最大长度。零表示无限长。请注意,对于穿越一个网络域到多个邮路的广播消息,最大长度是400_In_     DWORD                 lReadTimeout,  //等待指定的数据时,用这个参数指定邮路使用的默认超时设置,以毫秒为单位。零表示不等待。常数MAILSLOT_WAIT_FOREVER表示一直等到数据到达_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes //指定一个结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符);*/hMailSlot = CreateMailslot(MAILSOLT_NAME, MAX_BUFFER_SIZE, MAILSLOT_WAIT_FOREVER, NULL);if (INVALID_HANDLE_VALUE == hMailSlot){printf("CreateMailslot fail:%d\n", GetLastError());return -1;}else{printf("CreateMailslot success...\n");}char szBuffer[MAX_BUFFER_SIZE] = {0};DWORD cbBytes = 0;BOOL bResult = FALSE;printf("Waiting for client connection...");while (TRUE){bResult = ReadFile(hMailSlot, szBuffer, MAX_BUFFER_SIZE - 1, &cbBytes, NULL);if ((!bResult) || (0 == cbBytes)){printf("ReadFile fail:%d...\n",GetLastError());CloseHandle(hMailSlot);return -1;}printf("recv client msg:[%s]", szBuffer);}CloseHandle(hMailSlot);return 0;
}

windows进程间通讯-邮路相关推荐

  1. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  2. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...

    本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...

  3. WIN32 进程间通讯-共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  4. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

    概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...

  5. Python3.5 queue 模块详解 和 进程间通讯

    queue - A synchronized queue class:https://docs.python.org/3/library/queue.html 菜鸟教程 - Python3 多线程:h ...

  6. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  7. Android中进程间通讯 AIDL

    Android中进程间通讯 AIDL IDL Interface Description Language  接口描述语言 AIDL Android IDL 适用场景:    client进程必须是A ...

  8. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  9. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

最新文章

  1. 华为代码质量军规 (1) 数组访问,必须进行越界保护
  2. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—国内外区块链发展现状
  3. 后端生成Token架构与设计详解
  4. si_meminfo获取当前系统物理内存使用情况
  5. Jenkins 在Windows下插件无法安装问题解决
  6. Eclipse\myeclipse加载项目building workspace过久
  7. 网易云上线新版容器服务,开放更多Kubernetes功能
  8. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_2.RabbitMQ研究-RabbitMQ介绍...
  9. P值计算(Excel)
  10. U盘量产-FC1179-453C98B3766B
  11. 图像滤镜艺术---乐高像素拼图特效滤镜的代码实现
  12. KDL简介---KDL、PyKDL、pykdl_utils之间关系
  13. go-ipfs-api
  14. 计算机在会计中的应用书籍,Excel在会计和财务中的应用
  15. [论文阅读] Facial Expression Recognition Using Residual Masking Network
  16. 单片机串口连接电脑,USB转TTL线的使用
  17. 程序员分析:99%的创业公司都不值得加入
  18. Spring Boot+JOOQ(一)基本环境搭建
  19. 康卡斯特使持续升级,以有线电视
  20. 大学生职业生涯规划书性格特征_大学生职业生涯规划书【十篇】

热门文章

  1. 指纹浏览器指纹追踪技术:指纹浏览器开源代码,浏览器指纹js插件
  2. 无需公网IP,SSH远程内网linux服务器
  3. Java生成中间logo的二维码(还可以加上二维码名称哦)
  4. 今有2018年1月1日—15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,将其读入Python中并用一个数据框变量df保存。分别绘制1月1日—10日的猪肉价格和牛肉价格走势
  5. AcWing 1064 骑士
  6. 同步非同步阻塞非阻塞 总结与区别
  7. HEVC/H265帧类型判断及NALU TYPE介绍
  8. 胡桃日记获取服务器版本信息,胡桃日记各渠道时装兑换领取方法
  9. Android 插桩之美,全面掌握
  10. 东北理科475分报计算机,2021年理科475分能上什么大学,高考理科475分能考什么大学(100所)...