进程间通信(6) 邮槽
- 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。
- 邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户端写入数据。
- 邮槽可以实现一对多的单向通信。但是数据量小,通常都是424字节以下。假设client1先send,client2再send,最后server可以连续receive两次
- 如果是网络通信,server的名称写".",client写服务器电脑名或ip地址
1. 过程
a. server 先CreateMailslot
b. client 再CreateFile连接之前的mailSlot
c. client writeFile
d. server readFile
2.该函数利用指定的名称来创建一个邮槽,然后返回所创建的邮槽的句柄。
HANDLE WINAPI CreateMailslot(__in LPCTSTR lpName,__in DWORD nMaxMessageSize,__in DWORD lReadTimeout,__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
参数 lpName
指定了将要创建的邮槽的名称,该名称的格式必须为 \.\mailslot\MailslotName。
在这里需要注意的是两个斜杠后的那个 “.”,在这里使用圆点代表的是本地机器,参数 nMaxMessageSize
用来指定可以被写入到邮槽的单一消息的最大尺寸,为了可以发送任意大小的消息,需要将该参数设置为 0 。参数 lReadTimeOut
指定读取操作的超时时间间隔,以毫秒作为单位。
读取操作在超时之前可以等待一个消息被写入到邮槽中,如果将这个值设置为 0 ,那么若没有消息可用的话,该函数将立即返回。如果将该值设置为 MAILSLOT_WAIT_FOREVER,则该函数会一直等待,直到有消息可用。参数 lpSecurityAttributes
一般设置为 NULL 即可,即采用 Windows 默认的针对于邮槽的安全性。
3. code
server:
HANDLE hMailslot;hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,MAILSLOT_WAIT_FOREVER,NULL);if(INVALID_HANDLE_VALUE==hMailslot){MessageBox("创建邮槽失败!");return;}char buf[100];DWORD dwRead;if(!ReadFile(hMailslot,buf,100,&dwRead,NULL)){MessageBox("读取数据失败!");CloseHandle(hMailslot);return;}MessageBox(buf);CloseHandle(hMailslot);
client
HANDLE hMailslot;hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE==hMailslot){MessageBox("打开邮槽失败!");return;}char buf[]="http://www.sunxin.org";DWORD dwWrite;if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL)){MessageBox("写入数据失败!");CloseHandle(hMailslot);return;}CloseHandle(hMailslot);
【引用】
- 代码 https://github.com/thefistlei/os/tree/main/processCommunication/mailSlot
- VC++ 深入详解 孙鑫
进程间通信(6) 邮槽相关推荐
- [Win]进程间通信——邮槽Mailslot
进程间通信 进程的地址空间是私有的.出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义.但是在一些具体的应用情况下需要多个进行相互配合 ...
- 进程间通信(7) “剪贴板“、“匿名管道“、“命名管道“、“邮槽“4种方式总结
1. 剪贴板和匿名管道只能同一-台机器上 命名管道和邮槽还可以实现跨网络的进程间通信; 邮槽是基于广播通信的,可以一对多的单向通信, 数据量较小,通常都是在424字节以下 命名管道只能点对点的单一的通 ...
- 进程间通信 - 邮槽实现
引子 前面的一篇博文介绍了进程之间通信的一种最为简单的方式, 也就是在本地进程之间通过剪贴板来实现进程间通信,而剪贴板自有其缺陷, 很显然的是,剪贴板只能在本地机器上实现, 无法实现本地进程与远程服务 ...
- 【免杀前置课——Windows编程】十、进程间通信(COPY_DATA通信,邮槽通信)、实现两进程通信(附代码)
进程间通信 进程间通信 1.COPY_DATA方式 2.邮槽的方式 实现两进程通信 进程接收端 进程发送端 错误调试小技巧 进程间通信 每个进程都有自己独立的4G内存空间,彼此是不能直接互相访问的.如 ...
- 《Windows核心编程》---邮槽通信
邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠UDP数据传输协议.使用邮槽通信的进程分为客户端和服务端,邮槽由服务端创建,创建后,客户端可以通过邮槽名打开邮槽,在获得邮槽句柄后可以向邮槽写入消 ...
- windows 邮槽mailslot 在服务程序内建立后客户端无权限访问(GetLastError() == 5)的问题...
邮槽创建在服务程序内,可以创建成功, 但外部客户端连接时 m_hMailslot = CreateFile("\\\\.\\mailslot\\zdpMailslot",GENER ...
- createfile 无权限_windows 邮槽mailslot 在服务程序内建立后客户端无权限访问(GetLastError() == 5)的问题...
邮槽创建在服务程序内,可以创建成功, 但外部客户端连接时 m_hMailslot = CreateFile("\\\\.\\mailslot\\zdpMailslot",GENER ...
- [WinApi]邮槽通信C/S实例
Just a test.高手无视. 服务端: //Code by Pnig0s1992 //Date:2012,3,19 #include <stdio.h> #include <W ...
- Linux、Windows进程间通信
Linux的进程间通信主要有管道.命名管道.消息队列.共享内存.信号量, Windows进程间通信有三个:匿名管道.命名管道(又叫FIFO).邮槽(MailSlot),实际上常用的还有一个:共享内存.
最新文章
- 利用源代码搭建lnmp环境
- 点云网络的论文理解(六)-Frustum PointNets 总体概括
- 查询SDE数据库,GSON报错:declares mutiple JSON fields named data
- BeetleX服务网关授权配置
- 阿里巴巴制定了这 16 条
- java 调试 工具_Java调试器–权威的工具列表
- hazelcast_带弹簧的Hazelcast分布式执行
- css高度已知,左右定宽,中间自适应三栏布局
- apache mesos_试用Apache Mesos HTTP API获得乐趣和收益
- react学习(47)----react中initialValue和value不能一起定义
- 在mount里看到哪个设备文件的一些笔记
- isis network-entity 49含义_电影《狮子王》真人版上映,经典英语台词背后的含义你看懂了吗...
- python3.7运行报错_Python 3.7 环境下运行 scrapy crawl 报错 def write(self, data, async=False)?...
- Pig安装及简单使用(pig0.12.0 hadoop2.2.0)
- Enterprise Library
- 工作记忆的认知神经科学
- Java编程那些事儿
- 【Ubuntu】 解决中文输入问题 --- 安装搜狗拼音输入法
- SpringCloud 微服务架构开源项目,适合接私活、毕业设计(附源码)
- HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)
热门文章
- html5 datalist属性,HTML5 元素 datalist 介绍
- python 标准错误输出_过程的实时标准输出/错误捕获
- mysql主从数据库怎么还口令,mysql数据库主从同步方法讲解
- 不同品牌发电机组间的并机知识
- 数据中心电池室管理之经济实用性方法的探索
- 学校机房项目交换机的配置:
- ML之xgboost:解读用法之xgboost库的core.py文件中的get_score(importance_type=self.importance_type)方法
- 成功解决Exception: Graph file doesn't exist, path=F:\File_Python\Python_example\Human_Posture_Detection\
- 成功解决TypeError: Object of type 'ndarray' is not JSON serializable
- redis读取自增时候指定的key问题