《Windows核心编程》---邮槽通信

进程间通信-邮槽 用邮槽实现在windows下的进程间通信 立即下载

邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠UDP数据传输协议。使用邮槽通信的进程分为客户端和服务端,邮槽由服务端创建,创建后,客户端可以通过邮槽名打开邮槽,在获得邮槽句柄后可以向邮槽写入消息。邮槽通信是单向的,只有服务端能从邮槽中读取消息,而客户端只能写入消息。消息是先进先出的。

通过邮槽通信的数据可以是任意格式的,但为了保证邮槽在各种Windows平台下都能够正常工作,邮槽通信一条消息的长度不能大于424字节。邮槽除了在本机上进行进程间通信外,还可以在主机之间进行通信。

实际上一个邮槽是驻留在内存中的一个Windows临时虚拟文件,利用Windows标准文件函数可以对邮槽写入或读取消息,但它不同于磁盘文件的地方是:当邮槽句柄被关闭后,邮槽中的消息将被全部删除。

 

因此,邮槽工作方式有三大特定:1)单向通信;2)广播消息;3)数据报传输。

 

1)邮槽的命名:

本机上邮槽命名格式://./mailslot/[path/]name;

例如://./mailslot/win/asce_comment;

不同主机间命名格式://DomainName/mailslot/[path/]name;

                            //ComputerName/mailslot/[path/]name;

也可以使用通配符,以进行广播://*/mailslot/[path/]name;

格式的说明:前两个反斜杠之后的字符表示服务器所在机器的名称,圆点表示是本地主机;“mailslot”是硬编码的,这几个字符不能改变,但大小写无所谓。“[path/]name”当然就是邮槽名字了。

2)关键的API

CreateMailslot,创建一个邮槽对象:

HANDLE WINAPI CreateMailslot(

  __in      LPCTSTR lpName, //邮槽名

  __in      DWORD nMaxMessageSize, //单一消息最大长度,为了可以发送任意大小的消息,

//一般将该参数设置为0

  __in      DWORD lReadTimeout, //读超时的时间:0(如果没有消息时立即返回);

//MAILSLOT_WAIT_FOREVER(直到读到消息才返回)

  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性

);

例子如下:

#include <windows.h>

#include <stdio.h>

 

HANDLE hSlot;

LPTSTR Slot = TEXT("////.//mailslot//sample_mailslot");

 

BOOL WINAPI MakeSlot(LPTSTR lpszSlotName)

{

    hSlot = CreateMailslot(lpszSlotName,

        0,                             // no maximum message size

        MAILSLOT_WAIT_FOREVER,         // no time-out for operations

        (LPSECURITY_ATTRIBUTES) NULL); // default security

 

    if (hSlot == INVALID_HANDLE_VALUE)

    {

        printf("CreateMailslot failed with %d/n", GetLastError());

        return FALSE;

    }

    else printf("Mailslot created successfully./n");

    return TRUE;

}

 

void main()

{

   MakeSlot(Slot);

}

 

 

GetMailslotInfo,获取指定邮槽的相关信息:

BOOL WINAPI GetMailslotInfo(

  __in       HANDLE hMailslot, //邮槽的句柄

  __out_opt  LPDWORD lpMaxMessageSize,         //返回消息的最大长度

  __out_opt  LPDWORD lpNextSize, //返回下一条消息的长度

  __out_opt  LPDWORD lpMessageCount, //返回消息的数量

  __out_opt  LPDWORD lpReadTimeout //返回读超时时间

);

例子如下:(这个例子同时是一个完整的邮槽服务端)

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

#include <strsafe.h>

 

HANDLE hSlot;

LPTSTR SlotName = TEXT("////.//mailslot//sample_mailslot");

 

BOOL ReadSlot()

{

    DWORD cbMessage, cMessage, cbRead;

    BOOL fResult;

    LPTSTR lpszBuffer;

    TCHAR achID[80];

    DWORD cAllMessages;

    HANDLE hEvent;

    OVERLAPPED ov;

 

    cbMessage = cMessage = cbRead = 0;

 

    hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));

    if( NULL == hEvent )

        return FALSE;

    ov.Offset = 0;

    ov.OffsetHigh = 0;

    ov.hEvent = hEvent;

 

    fResult = GetMailslotInfo( hSlot, // mailslot handle

        (LPDWORD) NULL,               // no maximum message size

        &cbMessage,                   // size of next message

        &cMessage,                    // number of messages

        (LPDWORD) NULL);              // no read time-out

 

    if (!fResult)

    {

        printf("GetMailslotInfo failed with %d./n", GetLastError());

        return FALSE;

    }

 

    if (cbMessage == MAILSLOT_NO_MESSAGE)

    {

        printf("Waiting for a message.../n");

        return TRUE;

    }

 

    cAllMessages = cMessage;

 

    while (cMessage != 0)  // retrieve all messages

    {

        // Create a message-number string.

 

        StringCchPrintf((LPTSTR) achID,

            80,

            TEXT("/nMessage #%d of %d/n"),

            cAllMessages - cMessage + 1,

            cAllMessages);

 

        // Allocate memory for the message.

 

        lpszBuffer = (LPTSTR) GlobalAlloc(GPTR,

            lstrlen((LPTSTR) achID)*sizeof(TCHAR) + cbMessage);

        if( NULL == lpszBuffer )

            return FALSE;

        lpszBuffer[0] = '/0';

 

        fResult = ReadFile(hSlot,

            lpszBuffer,

            cbMessage,

            &cbRead,

            &ov);

 

        if (!fResult)

        {

            printf("ReadFile failed with %d./n", GetLastError());

            GlobalFree((HGLOBAL) lpszBuffer);

            return FALSE;

        }

 

        // Concatenate the message and the message-number string.

 

        StringCbCat(lpszBuffer,

                    lstrlen((LPTSTR) achID)*sizeof(TCHAR)+cbMessage,

                    (LPTSTR) achID);

 

        // Display the message.

 

        _tprintf(TEXT("Contents of the mailslot: %s/n"), lpszBuffer);

 

        GlobalFree((HGLOBAL) lpszBuffer);

 

        fResult = GetMailslotInfo(hSlot,  // mailslot handle

            (LPDWORD) NULL,               // no maximum message size

            &cbMessage,                   // size of next message

            &cMessage,                    // number of messages

            (LPDWORD) NULL);              // no read time-out

 

        if (!fResult)

        {

            printf("GetMailslotInfo failed (%d)/n", GetLastError());

            return FALSE;

        }

    }

    CloseHandle(hEvent);

    return TRUE;

}

 

BOOL WINAPI MakeSlot(LPTSTR lpszSlotName)

{

    hSlot = CreateMailslot(lpszSlotName,

        0,                             // no maximum message size

        MAILSLOT_WAIT_FOREVER,         // no time-out for operations

        (LPSECURITY_ATTRIBUTES) NULL); // default security

 

    if (hSlot == INVALID_HANDLE_VALUE)

    {

        printf("CreateMailslot failed with %d/n", GetLastError());

        return FALSE;

    }

    return TRUE;

}

 

void main()

{

   MakeSlot(SlotName);

 

   while(TRUE)

   {

      ReadSlot();

      Sleep(3000);

   }

}

 

SetMailslotInfo,修改已创建邮槽读操作的超时时间:

BOOL WINAPI SetMailslotInfo(

  __in  HANDLE hMailslot, //邮槽句柄

  __in  DWORD lReadTimeout //新的读超时时间

);

 

邮槽的客户端代码如下:

#include <windows.h>

#include <stdio.h>

 

LPTSTR SlotName = TEXT("////.//mailslot//sample_mailslot");

 

BOOL WriteSlot(HANDLE hSlot, LPTSTR lpszMessage)

{

   BOOL fResult;

   DWORD cbWritten;

 

   fResult = WriteFile(hSlot,

     lpszMessage,

     (DWORD) (lstrlen(lpszMessage)+1)*sizeof(TCHAR), 

     &cbWritten,

     (LPOVERLAPPED) NULL);

 

   if (!fResult)

   {

      printf("WriteFile failed with %d./n", GetLastError());

      return FALSE;

   }

 

   printf("Slot written to successfully./n");

 

   return TRUE;

}

 

int main()

{

   HANDLE hFile;

 

   hFile = CreateFile(SlotName,

     GENERIC_WRITE,

     FILE_SHARE_READ,

     (LPSECURITY_ATTRIBUTES) NULL,

     OPEN_EXISTING,

     FILE_ATTRIBUTE_NORMAL,

     (HANDLE) NULL);

 

   if (hFile == INVALID_HANDLE_VALUE)

   {

      printf("CreateFile failed with %d./n", GetLastError());

      return FALSE;

   }

 

   WriteSlot(hFile, TEXT("Message one for mailslot."));

   WriteSlot(hFile, TEXT("Message two for mailslot."));

 

   Sleep(5000);

 

   WriteSlot(hFile, TEXT("Message three for mailslot."));

 

   CloseHandle(hFile);

 

   return TRUE;

}

 

由于邮槽是基于广播通信的,所以邮槽可以实现一对多的单向通信,例如,我们可以利用邮槽编写一个网络会议的通知系统。在每个被通知人电脑上安装服务端,通知人电脑上安装客户端即可。

进程间通过邮槽通信实例 进程间通过邮槽通信实例,平台VS2010。这只是一个简单实例,供大家学习参考用。本人也只是菜鸟一个。 立即下载

相关推荐

一个简单的邮槽例子,包含客户端和服务器

这是一个简单的邮槽通讯的例子,包含客户端和服务器

进程的通信 - 邮槽

邮槽是Windows系统提供的一种单向进程间的通信机制。对于相对简短的地坪率信息发送,使用邮槽通常比命名管道或者Unix域套接字更简单使用邮槽通信的进程分为服务端和客户端。邮槽,在创建时需要指定邮槽名,创建后邮槽。在邮槽创建后,客户端可以通过邮槽名打开邮槽,在获得句柄后可以向邮槽写入消息。,只有服务端才能从邮槽中读取消息,客户端只能写入消息。消息先入先出。客户端先写入的消息在服务端先被读取。通过邮槽通信的数据可以是任意格式的,但是一条消息。邮槽除了在本机内进行进程间的通信外,在主机间也可以通信。

qq_54169998的博客 940

进程间通信-邮槽,邮槽,邮槽

进程间通信,进程间通信,邮槽进程间通信,进程间通信,邮槽进程间通信,进程间通信,邮槽

邮槽通信

邮槽定义 邮槽(Mailslot)也称为邮件槽,其是 Windows 提供的一种用来实现进程间通信的手段, 其提供的是基于不可靠的,并且是单向数据传输的服务。 邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据, 何为服务端?何为客户端? 服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。 还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数

Ginvar的专栏 1425

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9747

【深度学习】肺结节分割项目实战二:分割肺实质

在后续训练模型的时候如果直接使用原始的肺部CT图像,其中的非肺区域会对训练造成干扰,因此我们需要提取分割肺实质。这一部分参考了kaggle上的教程。 从这张CT图像中可以看出扫描器以外的部分为黑色,背景和肺内部颜色较深,非肺组织和骨头颜色较浅。我们的目的是将肺部分割出来。由于肺部区域和其他部分对比明显,我们可以设置一个合适的阈值对图像中的区域进行隔离。 import argparse import os import numpy as np from medpy.filter.smoothing imp

weixin_42182906的博客 7240

进程间通信——命名管道和邮槽

前面介绍了进程间通信的两种方法:剪贴板和匿名管道。这两种进程间通信的方法只能在本地主机的进程之间通信。而匿名管道还限制通信的两进程之间必须有父子关系。在开发网络间不同进程之间相互通信的应用程序时,我们可以用命名管道和邮槽。这两种方法不仅支持本地主机通信也支持网间进程通信。下面详细介绍这两种方法: 一、命名管道 将命名管道作为网络通信的方案时,他实际上建立了一个客户机/...

HeartHelp2013的博客 479

Codex App 远程 SSH 连接 autodl 配置全攻略

SSH 远程连接是开发中常用的技术,通过加密通道实现本地与远程服务器的安全通信。其原理基于非对称加密和密钥对认证,确保数据传输安全。在 AI 开发场景中,远程连接能充分利用云端 GPU 算力,同时保留本地编辑器的流畅体验。autodl 作为主流算力云平台,支持通过 SSH 接入实例,但 Codex App 等工具需额外配置。本文详细讲解如何获取 autodl 的 SSH 接入信息、配置密钥登录、填写 Codex App 远程连接参数,并解决连接拒绝、权限报错等常见问题,帮助开发者高效搭建远程开发环境。

weixin_28312391的博客 257

Tcp中 QDataStream QTextStream 数据流 、文本流的使用

有新的数据可读时,该信号就会被触发。程序可以连接到该信号,并在该信号触发时读取数据。这个信号非常有用,可以用于实现异步的网络通信,即不必阻塞主线程,而是在数据到达时发出信号并交由另一个线程处理。给服务器/客户端发送数据,使用QFileDialog类找到文件,QFile类打开文件,读取文件,将文件内容使用QDataStream写入服务器/客户端对象中。槽函数readReadSlot(): 读取服务器/客户端发送的数据。读取服务器/客户端发送的数据。给服务器/客户端发送信息。

weixin_73535565的博客 669

Mixly 数码管时钟

  本文是米思齐数码管图形化编程实验总结分享,走过路过的来看看吧,其中的不足望指出。 一、实验目的及要求 【实验一】实现滚动显示自定义字符串。 【实验二】实现显示自定义时间。 【实验三】实现显示秒表。 二、实验原理与内容 实现米思齐的数码管图形化编程。 三、实验软硬件环境 硬件:Arduino、TM1637数码管 软件:Mixly IDE 四、核心代码及实验效果如下所示 1.实现滚动显示...

weixin_44614199的博客 1647

1.47寸ST7789V3彩屏硬件设计与驱动调试指南

TFT LCD是一种基于薄膜晶体管阵列控制像素明暗的主动式显示技术,其核心依赖于专用驱动IC(如ST7789V3)完成时序生成、GRAM管理与伽马校正。该类小尺寸彩色显示屏广泛应用于嵌入式HMI、IoT终端与可穿戴设备,具备高PPI、低功耗和SPI接口易集成等工程优势。理解RGB565数据格式、SPI Mode 0通信时序及关键寄存器(如0x36方向控制、0x3A像素格式、0x2A/0x2B地址窗口)是实现稳定显示的基础;而正确处理电源设计(严禁5V直供)、复位时序与背光PWM调光,则直接决定系统可靠性与能

weixin_30995917的博客 165

[Win]进程间通信——邮槽Mailslot

进程间通信 进程的地址空间是私有的。出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义。但是在一些具体的应用情况下需要多个进行相互配合,有时计算机用户也需要在多个应用程序之间交换数据。 Windows系统下,在进程间通信或共享数据的方式如下。 邮槽( Mailslot)。邮槽是最为简单的进程间数据共享方式,一个进程创建

超越 7529

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1608

基于visual c++之windows核心编程代码分析(16)使用邮槽进行进程通信

在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,邮槽是其中实现单通道进程间通信的一种。创建邮槽的进程被称为邮槽服务器,而其它发送消息给邮槽的进程被称为邮槽客户端。邮槽客户端能发送消息给本机的邮槽,也可发送消息给局域网内其他计算机内的邮槽,所有这些消息都存储在邮槽内,直到邮槽服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数据报的

尹成的技术博客 3327

月薪2万+的网络工程师,到底藏着哪些“绝活”?

在IT圈,网络工程师是个既神秘又硬核的职业。月薪2万+的网工,早已不是只会拉网线、改IP的“IT民工”,而是掌握了一身“绝技”的技术大牛。他们能让企业网络如丝般顺滑,面对宕机临危不乱,还能用自动化脚本批量搞定上百台设备。想知道这些高薪网工的秘密武器是什么?今天,我就以一个老网工的视角,结合自己和同行们的实战经验,扒一扒那些月薪2万+的网络工程师都身怀哪些绝技。如果你也想挤进高薪行列,不妨参考参考!

网络技术联盟站 359

【Unity-UGUI控件全面解析】| Layout自动布局组件详解

UGUI中有个自动布局组件Auto Layout,主要包含下面几个模块(点击可进入官方文档下查看描述): 自动布局 布局元素 (Layout Element) 水平布局组 (Horizontal Layout Group) 垂直布局组 (Vertical Layout Group) 网格布局组 (Grid Layout Group) 内容大小适配器 (Content Size Fitter) 自动布局系统 基于布局元素和布局控制器的概念。一个布局元素是具有矩形变换以及其他可选组件的游戏对象。布局元素对自身

努力前行,总会成为自己心中的那道光 2万+

Windows核心编程之邮槽实现进程间通信

邮槽是Windows系统提供的一种单向通信的机制。即进程中的一方只能写入或读取数据,而另一方则只能读取或写入数据。通过邮槽,用户可以实现一对多或跨网络的进程之间的通信。但是,邮槽能传输的数据非常小,一般在400KB左右。如果用户操作的数据过大,可能会导致邮槽不能正常工作。 1.创建邮槽     用户在实际编程时,可以使用Windows邮槽实现进程间通信。但是用户必须首先创建邮槽。在Window

小伟锅的博客 1531

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Windows邮槽通信:原理、实现与应用场景

进程间通信(IPC)是操作系统实现多进程协作的核心机制,其中基于消息传递的通信模式因其松耦合特性被广泛应用。Windows平台提供的邮槽(Mailslot)机制采用UDP协议实现单向数据报传输,具有系统开销低、支持一对多广播等特性。这种轻量级IPC技术特别适合服务状态监控、局域网设备发现等需要高效广播的场景,其424字节的消息长度限制和不可靠传输特性决定了适用边界。通过文件API的标准操作接口,开发者可以快速实现跨进程消息传递,结合IOCP完成端口等技术还能构建高并发日志收集系统。在工业控制、分布式监控等实

weixin_29281915的博客 349

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 《认清C++语言》---继承而来的非虚函数和缺省参数
下一篇: 《Windows核心编程》---剪贴板
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值