windows进程间通讯-邮路
邮路是由邮路服务进程创建。当邮路服务进程创建了一个邮路后,便返回该邮路句柄。当某个进程需要从该邮路中读取消息时,它必须提供该句柄。只有创建该邮路的进程,或以某种机制(比如继承)获得该邮路句柄的进程能够从邮路中读取消息。与管道不同,所有的邮路都是从属于创建它的本地进程的,你无法创建一个远程的邮路。邮路的客户进程具有向邮路写入消息的权限。任何进程只要获得了邮路的名字,就可以往里面写入消息,新的消息将放在邮路的消息队列后面。
邮路能在一个域中广播消息。如果域中几个进程每个都用相同的名字创建了一个邮路,则它们都会收到送往该邮路的消息。
在邮路中传递的消息如果小于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进程间通讯-邮路相关推荐
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- WIN32 进程间通讯-共享内存
一.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...
- Python3.5 queue 模块详解 和 进程间通讯
queue - A synchronized queue class:https://docs.python.org/3/library/queue.html 菜鸟教程 - Python3 多线程:h ...
- Android-Binder进程间通讯机制-多图详解
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...
- Android中进程间通讯 AIDL
Android中进程间通讯 AIDL IDL Interface Description Language 接口描述语言 AIDL Android IDL 适用场景: client进程必须是A ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
最新文章
- 华为代码质量军规 (1) 数组访问,必须进行越界保护
- BC:带你温习并解读《中国区块链技术和应用发展白皮书》—国内外区块链发展现状
- 后端生成Token架构与设计详解
- si_meminfo获取当前系统物理内存使用情况
- Jenkins 在Windows下插件无法安装问题解决
- Eclipse\myeclipse加载项目building workspace过久
- 网易云上线新版容器服务,开放更多Kubernetes功能
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_2.RabbitMQ研究-RabbitMQ介绍...
- P值计算(Excel)
- U盘量产-FC1179-453C98B3766B
- 图像滤镜艺术---乐高像素拼图特效滤镜的代码实现
- KDL简介---KDL、PyKDL、pykdl_utils之间关系
- go-ipfs-api
- 计算机在会计中的应用书籍,Excel在会计和财务中的应用
- [论文阅读] Facial Expression Recognition Using Residual Masking Network
- 单片机串口连接电脑,USB转TTL线的使用
- 程序员分析:99%的创业公司都不值得加入
- Spring Boot+JOOQ(一)基本环境搭建
- 康卡斯特使持续升级,以有线电视
- 大学生职业生涯规划书性格特征_大学生职业生涯规划书【十篇】
热门文章
- 指纹浏览器指纹追踪技术:指纹浏览器开源代码,浏览器指纹js插件
- 无需公网IP,SSH远程内网linux服务器
- Java生成中间logo的二维码(还可以加上二维码名称哦)
- 今有2018年1月1日—15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,将其读入Python中并用一个数据框变量df保存。分别绘制1月1日—10日的猪肉价格和牛肉价格走势
- AcWing 1064 骑士
- 同步非同步阻塞非阻塞 总结与区别
- HEVC/H265帧类型判断及NALU TYPE介绍
- 胡桃日记获取服务器版本信息,胡桃日记各渠道时装兑换领取方法
- Android 插桩之美,全面掌握
- 东北理科475分报计算机,2021年理科475分能上什么大学,高考理科475分能考什么大学(100所)...