Windows进程间通信之命名管道

windows进程间通信系列 第三篇 匿名管道与命名管道 剪贴板的话只能实现本机上进程之间的通信,而邮槽的话虽然是可以实现跨网络之间的进程的通信,但麻烦的是邮槽的服务端只能接收数据,邮槽的客户端只能发送数据,太悲剧了,而对于匿名管道的话,其也只能实现本机上进程之间的通信,你要是能够实现本机进程间的通信也就算了,关键是它还只用来实现本地的父子进程之间的通信,也太局限了吧?而这里介绍的这个命名管道的话,就和他们有些不同了,在功能上也就显得强大很多了,至少其可 阅读详情
        命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。命名管道服务器只能在WindowsNT或Windows2000上创建,不过可以是客户机。命名管道提供了两种基本通信模式,字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读入。

      创建一个命名管道:

HANDLE WINAPI CreateNamedPipe(

  __in          LPCTSTR lpName,       //管道名称

  __in          DWORD dwOpenMode,  //管道访问方式

  __in          DWORD dwPipeMode,   //管道模式

  __in          DWORD nMaxInstances,

  __in          DWORD nOutBufferSize,

  __in          DWORD nInBufferSize,

  __in          DWORD nDefaultTimeOut,

  __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

创建一个命名管道的实例,并返回其句柄。

创建实例成功后,等待客户端进程:

BOOL WINAPI ConnectNamedPipe(

  __in          HANDLE hNamedPipe,

  __in          LPOVERLAPPED lpOverlapped

);

注意此函数返回值的判断,当返回值为0时不一定就表示失败,应该继续判断返回值是否为ERROR_IO_PENDING,如果是不表示失败了。

此函数允许一个命名管道服务器进程等待一个客户端进程连接到命名管道的实例上;如果命名管道的创建方式是FILE_FLAG_OVERLAPPED,并且参数lpOverlapped不为空,结构体OVERLAPPED应当包括一个人工重置的事件对象(可以用CreateEvent()创建):

HANDLE WINAPI CreateEvent(

  __in          LPSECURITY_ATTRIBUTES lpEventAttributes,

  __in          BOOL bManualReset,

  __in          BOOL bInitialState,

  __in          LPCTSTR lpName

);

typedef struct _OVERLAPPED {
  ULONG_PTR Internal;
  ULONG_PTR InternalHigh;
  union {
    struct {
      DWORD Offset;
      DWORD OffsetHigh;
    };
    PVOID Pointer;
  };
  HANDLE hEvent;

} OVERLAPPED,
 *LPOVERLAPPED;

此结构体只需设置第五个参数。

然后调用函数:

DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);

用来等待我们这个事件对象变为有信号状态。

客户端编写:

构造函数来对句柄初始化,析构函数关闭句柄。

在连接之前首先判断是否存在有可利用的命名管道实例:

BOOL WINAPI WaitNamedPipe(

  __in          LPCTSTR lpNamedPipeName,

  __in          DWORD nTimeOut

);

如果存在,再用CreateFile()打开一个管道。

程序实例:

服务器端:

void CNamedPipeSrvView::OnPipeCreate()
{
 // TODO: 在此添加命令处理程序代码
 hPipe=CreateNamedPipe("
\\\\.\\pipe\\MyPipe",PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0,1,1024,1024,0,NULL);
 if(INVALID_HANDLE_VALUE==hPipe)
 {
  MessageBox("创建命名管道失败!");
  hPipe=NULL;
  return;
 }
 HANDLE hEvent;
 hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
 if(!hEvent)
 {
  MessageBox("创建事件对象失败!");
  CloseHandle(hPipe);
  hPipe=NULL;
  return;
 }
    OVERLAPPED ovalp;
 ZeroMemory(&ovalp,sizeof(OVERLAPPED));
 ovalp.hEvent=hEvent;
 if(!ConnectNamedPipe(hPipe,&ovalp))
 {
  if(ERROR_IO_PENDING!=GetLastError())
  {
   MessageBox("等待客户端连接失败!");
   CloseHandle(hPipe);
   CloseHandle(hEvent);
   hPipe=NULL;
   return;
  }
 }
    if(WAIT_FAILED ==WaitForSingleObject(hEvent,INFINITE))
 {
  MessageBox("等待对象失败!");
  CloseHandle(hPipe);
  CloseHandle(hEvent);
  hPipe=NULL;
  return;
 }
 CloseHandle(hEvent);
}

客户机端:

void CNamedPipeCltView::OnPipeConnect()
{
 // TODO: 在此添加命令处理程序代码
 if(!WaitNamedPipe("
\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER))
 {
  MessageBox("当前没有可利用的命名管道实例!");
  return;
 }
 hPipe=CreateFile("
\\\\.\\pipe\\MyPipe",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(INVALID_HANDLE_VALUE ==hPipe)
 {
  MessageBox("打开命名管道失败!");
  hPipe=NULL;
  return;
 }
}

 

 

 

 

 

命名管道学习(简单例程)----Windows进程间通信 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。通常我们把管道分为匿名管道和命名管道。但对于匿名管道的话,只能在本机上进程之间通信,而且只能实现本地的父子进程之间的通信,局限性太大了。而这里介绍的命名管道,就和匿名管道有些不同了,在功能上也就显得强大许多,至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数... 阅读详情

相关推荐

Windows命名管道进程间通信实践指南

命名管道是一种在Windows平台上被广泛使用的IPC技术,允许位于不同机器或同一机器上的客户端和服务器之间进行双向数据交换。其特点在于通过一个唯一的名称标识,可以实现多个进程间的并发访问。相比匿名管道,命名管道的这种命名特性,使得它具备了更高的灵活性和可管理性。在分布式系统中,服务器进程和客户端进程扮演着各自独特的角色,共同实现网络通信和数据交换。本章节将深入探讨服务器进程和客户端进程的定义、工作机制以及它们在通信过程中的职责。

weixin_42596246的博客 967

用命名管道实现进程间的通信的技巧

1.问题阐述命名管道是通过网络来完成进程间的通信的,它屏蔽了底层的网络协议细节。所以在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。命名管道充分利用了Windows NT和Windows 2000内建的安全机制。命名管道是围绕Windows文件系统设计的一种机制,采用“命名管道文件系统(Named Pipe File System,NPFS)”接口。将命名管道作为一种网络编程方

痞子龙3D编程 1387

CSP历年真题201503-1-图像旋转(C/C++)

一、问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。 输入格式 二、输入格式 输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。 接下来n行每行包含m个整数,表示输入的图像。 三、输出格式 输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。 四、...

GTboy100的博客 1670

C winapi 进程间通信(Named Pipe)。

要求实现: 用命名管道的相关知识及函数,分别编写服务器进程和客户端进程程序。 要求服务器进程和客户端进程程序能够通过互相传送数据。 当服务器进程和客户端进程中的任何一端输入“end”时,结束会话。 写了半天,发现如果只用单个管道的话,非常的困难,进程总是卡住,感觉难点在于服务器进程怎么主动地像客户端进程发送信息,研究了一天还是未解决这个问题。。。 最后是写了个双管道的(每个进程都...

weixin_34208283的博客 638

JMeter脚本录制-快速上手篇

有的项目应用场景下,压测时,需要考虑带宽因素,压测不只是压测接口,静态资源也要一起压测。一般来说,静态资源比较多,如果一个个手工去写请求,是比较繁琐的,此时,可以使用Jmeter的脚本录制功能。 步骤1,创建脚本录制模版。 JMeter菜单:文件>模版,下拉选择到Recording,点击“Create”按钮; 填写录制参数: hostToRecord:填写要录制的主机域名,例如,我们这里填入:www.baidu.com schemeToRecord:填写要录制的模式,例如,htt...

软件测试大叔 5734

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2883

使用命名管道实现进程通信

实验四:使用命名管道实现进程通信 一、实验目的 了解windows系统环境下的进程通讯机制。 熟悉Windows系统提供的进程通信API。 二、实验准备 相关API函数介绍 建立命名管道 函数CreateNamePipe()创建一个命名管道实例,并返回该管道的句柄。 原型: HANDLE CreateNamePipe( LPCTSTR lpName, //命名管道的名字 DWORD dwOpenMode, /

G453473123的博客 1683

终端效率神器:Tmux 安装与使用全指南

终端效率神器:Tmux 安装与使用全指南

身在被窝_心在编程 1358

通过NamedPipe命名管道实现进程间通信(C#实现,包括客户端和服务端)

文章目录一、前言二、关于命名管道三、运行效果四、Demo工程源码五、核心代码 一、前言 最近在做一个这样的功能,Unity发布PC平台的客户端exe,在客户端exe中拉起浏览器exe(这个浏览器是自己使用winform实现的),浏览器内调用JsApi执行支付,支付结果会回调游戏服务端URL,服务端通过消息通知客户端exe,此时客户端exe通过进程间通信让浏览器exe关闭。 好了,进程间怎么通信呢? 实现进程间通信有很多中方案:管道(pipe)、命名管道(FIFO)、消息队列(MessageQueue)、共享

linxinfa的专栏 6685

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

AutoSAR系列讲解(入门篇)4.1-BSW概述

BSW概述,主要讲解BSW的结构组成

雪云飞星的博客 4万+

利用windows api实现进程通信(命名管道)

服务端: 1.使用API函数CreateNamedPipe建立与命名管道的连接。 2.使用API函数ConnectNamedPipe等待客户端的连接。(可用这个函数将一个管道换成同另一个客户连接,也就是可以重复调用该函数,但必须用DisconnectNamedPipe函数断开之前进程的连接) 3.使用API函数WriteFile和ReadFile分别向客户端发送数据或从客户端接收数据。 4.使用A...

Think88666的博客 2667

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

进程间通信-windows命名管道详解以及完整代码实现

命名管道具有简单易用、跨平台兼容性、双向通信、安全性和可靠性等优点。然而,它也受到单机通信限制、性能瓶颈、同步问题、复杂性增加和依赖性等缺点的制约。命名管道通常只适用于同一台计算机上的进程间通信。虽然有些操作系统(如Windows)可能支持跨网络的命名管道通信,但这种方式通常不如套接字(Sockets)等网络通信机制灵活和高效。因此,在选择IPC机制时,应根据实际需求考虑数据传输的速度、大小、方向以及进程间的亲缘关系等因素。

红军不怕远征难,万水千山只等闲 2972

qcc304x笔记之手机端显示电量(九)

默认的sdk有些安卓手机不支持电量显示,所以需要加电量显示的补丁 流程分析 1. 首先新建一个task,并将task注册给电池模块 appBatteryRegister(batteryRegistrationForm) 实现handler处理函数,当battery模块电池电量更新后,会将电池百分比值发送到本模块,然后我们就可以在handler中将实时电量同步到手机端了。 hfpAtCmdInit atCmdTask.task.handler = appAtCmdHandleM...

在云巅的博客 2199

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

dart 命名管道 进程间通信 windows示例

Dart 中的命名管道可以用来在 Windows 上进行进程间通信。下面是一个示例: 创建管道: ```dart import 'dart:io'; final pipeServer = await ServerSocket.bind('127.0.0.1', 0, shared: true); final pipeName = pipeServer.address.address + '-'...

weixin_35749545的博客 298

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python命名管道通讯_Python进程间通信的命名管道详解(Windows)

本文和大家分享的主要是windows系统下,python进程间通信的命名管道相关内容 ,一起来看看吧,希望对大家学习python有所帮助。在Windows上的命名管道主要是通过调用win32 api的以下方法来实现的:- win32pipe.CreateNamedPipe()- win32pipe.ConnectNamedPipe()- win32file.ReadFile()- win32...

weixin_32350433的博客 715

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python进程间通信之命名管道(Windows)

前面文章说了一下 Linux 命名管道的实现,今天看看 Windows 上我们怎么实现。在 Windows 上的命名管道主要是通过调用 win32 api 的以下方法来实现的: - win32pipe.CreateNamedPipe() - win32pipe.ConnectNamedPipe() - win32file.ReadFile() - win32file.WriteFile()下

kongxx的专栏 9059

Windows系统编程之进程间通信-异步管道和命名管道

Windows系统编程之进程间通信 Windows 的IPC(进程间通信)机制主要是异步管道和命名管道。(至于其他的IPC方式,例如内存映射、邮槽等这里就不介绍了) 管道(pipe)是用于进程间通信的共享内存区域。创建管道的进程称为管道服务器,而连接到这个管道的进程称为管道客户端。一个进程向管道写入信息,而另外一个进程从管道读取信息。 异步管道是基于字符和半双工的(即单向),一般用于程序

u012422855的专栏 3082

Windows进程间通信—命名管道

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。

zjc156m的专栏 774

C++单头文件实现windows进程间通信(基于命名管道)

这篇文章介绍了一个名为win-pipe的Windows专用命名管道库,主要包含接收器(receiver)、发送器(sender)和双向管道(DuplexPipe)三个核心组件。接收器通过异步线程处理消息接收并调用回调函数,发送器提供简单的消息发送功能,双向管道则封装了二者实现双向通信。该库采用MIT许可证,提供了线程安全的消息处理机制,支持管道连接管理、错误处理和资源自动释放。代码结构清晰,包含详细的注释说明各个类的功能和使用方法,适合需要进程间通信的Windows应用程序开发。

xmyzqs1212的博客 505

Windows进程间通信--命名管道

1相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制。命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信。 命名管道利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议等细节。命名管道是围绕windows文件系统设计的一种机制,采用“命名管道文件系统”(Named Pipe F...

weixin_30399797的博客 600

!!!Windows系统编程之进程间通信---异步管道和命名管道

Windows系统编程之进程间通信作者:北极星2003来源:看雪论坛(www.pediy.com) 附件:windowipc.rar, 已经下载到 “F:\工程硕士\电子书\11 VC 项目\命名管道”Windows的IPC(进程间通信)机制主要是异步管道和命名管道。(至于其他的IPC方式,例如内存映射、邮槽等这里就不介绍了)管道(pipe)是用于进程间通信的共享内存区域。创建管道的进程称为...

weixin_30679823的博客 184
上一篇: Windows进程通信方式之匿名管道
下一篇: Windows进程间通信之邮槽
sdudubing
博客等级 码龄16年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值