用邮槽进行进程间通信

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

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

 

 

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

 

  这种进程间通信的方式比较适用于在局域网环境内传送和接收短消息,也可在局域网内向所有计算机广播消息。

 

  用邮槽进行进程间通信主要通过三个步骤来实现:创建邮槽服务器,向邮槽发送消息和从邮槽中读取消息。下面笔者将用Windows的API函数来完成这三个步骤。

 

 

  一、创建邮槽服务器

 

 

  以下代码用于创建一个名叫sample_mailslot的邮槽:

 

  BOOL FAR PASCAL Makeslot( )

 

  {

 

   // 邮槽名称都定义在//./mailslot/目录下

 

  LPSTR lpszSlotName = "////.//mailslot//sample_mailslot";

 

   // 邮槽句柄"hSlot1" 是一个全局变量

 

   hSlot1 = CreateMailslot(lpszSlotName,0,

 

  // 对接受的消息没有最大值限制

 

   MAILSLOT_WAIT_FOREVER, // 没有最大读延迟时间

 

  (LPSECURITY_ATTRIBUTES) NULL); // 无安全属性

 

   if (hSlot1 == INVALID_HANDLE_VALUE)

 

  //创建邮槽失败

 

   return FALSE;

 

   return TRUE;

 

  }

 

 

  二、客户端与邮槽服务器通信

 

 

  客户端通过API函数向邮槽发送消息,然后消息被广播到域内的每一台计算机上,但只有指定的邮槽接收这些消息。在这里要注意被广播的消息每条不能超过400个字节,但对每个邮槽能接受的消息的数量没有限制。

 

  BOOL FAR PASCAL Writeslot( ) {

 

  BOOL fResult;

 

  HANDLE hFile;

 

  DWORD cbWritten;

 

   LPSTR lpszMessage = "Message for sample_mailslot in primary domain";

 

  hFile = CreateFile("////*//mailslot//sample_mailslot",

 

   GENERIC_WRITE,

 

   FILE_SHARE_READ,

 

   (LPSECURITY_ATTRIBUTES) NULL,

 

   OPEN_EXISTING,

 

   FILE_ATTRIBUTE_NORMAL,

 

   (HANDLE) NULL);

 

  if (hFile == INVALID_HANDLE_VALUE)

 

  // 创建客户端邮槽句柄失败

 

   return FALSE;

 

   fResult = WriteFile(hFile, lpszMessage,

 

   (DWORD) lstrlen(lpszMessage) + 1,

 

   &&cbWritten,

 

  (LPOVERLAPPED) NULL);

 

   if (!fResult)

 

  // 发送消息错误

 

   return FALSE;

 

  fResult = CloseHandle(hFile);

 

   return TRUE;

 

   }

 

 

  三、从邮槽中读取数据

 

 

  邮槽服务器通过GetMailslotInfo函数判断邮槽中是否有数据,如果有,则通过ReadFile函数从邮槽中读取。下面的代码完成从邮槽中读取一条消息。

 

  BOOL FAR PASCAL Readslot()

 

  {

 

  DWORD cbMessage, cMessage, cbRead;

 

   BOOL fResult;

 

   LPSTR lpszBuffer;

 

   cbMessage = cMessage = cbRead = 0;

 

  //邮槽句柄hSlot1是一个全局变量

 

  fResult = GetMailslotInfo(hSlot1,

 

  // 邮槽句柄

 

   (LPDWORD) NULL, // 对消息的大小没有最大限制

 

   &&cbMessage, // 下一条消息的大小

 

   &&cMessage, // 消息的数量 (LPDWORD) NULL); if(cbMessage == MAILSLOT_NO_MESSAGE)

 

  // 邮槽内无消息

 

   { printf( "No waiting messages.");

 

   return TRUE; }

 

  // 为消息分配内存

 

   lpszBuffer = (LPSTR) GlobalAlloc(GPTR, cbMessage);

 

   lpszBuffer[0] = '/0'; fResult = ReadFile(hSlot1, lpszBuffer, cbMessage, &&cbRead,

 

   (LPOVERLAPPED) NULL);

 

   // 显示消息

 

   Printf("%s",lpszBuffer);

 

   GlobalFree((HGLOBAL) lpszBuffer);

 

   return TRUE;

      }     

vc++ 实例(包括服务器和客户端) VC++实例,完整代码,包括服务器端和客户端 立即下载

相关推荐

进程间通信demo

编译环境 VS2010 通过mailsolt来实现进程间通信,使用方法: 两个exe,一个服务端一个客户端,打开服务端创建 再打开客户端输入要发送的信息点击发送 回到服务端点击接受,注意每次发送信息前都需要创建

VC 如何用进行进程间通信

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

miaoshengwu Blog 1790

进程间通信-

进程间通信进程间通信进程间通信进程间通信进程间通信进程间通信

进程通信之间的通信

通信是基于无连接不可靠的数据传输,并且只能单向通信服务器端尽可以读取数据,客户端仅可以写入数据,实现单向通信,其次如果要用实现双向通信,那么每个主机既是客户端也是服务器端。有点P2P的感觉,将一下流程 首先服务器端调用CreateMailslot函数来创建 hMail= CreateMailslot(TEXT("\\\\.\\mailslot\\laimail"),0,MAILS

ChampionLai 1235

windows 进程间通信--通信的实现

除了可以再本机内进行通讯外,还可以在主机之间进行通讯(使用UDP协议),想要通过网络进行通讯必须知道服务端的主机名和域名。的通讯是单向的,只有服务端才能从中读取消息,客户端只能写入,消息被写入后以队列的方式保存。每个进程都有自己独立的4G内存空间,彼此是不能直接互相访问的。是windows系统中最简单的一种进程间的通信方式,一。,不同于其他只能携带两个固定参数的消息。WM_COPYDATA是一个特殊的,属性, 链接器 系统 :子系统改为。属性,链接器,高级 : 入口点填写。

ylh的博客 596

[Win]进程间通信——Mailslot

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

超越 7498

进程间通信 - 实现

<br />引子<br />前面的一篇博文介绍了进程之间通信的一种最为简单的方式,<br />也就是在本地进程之间通过剪贴板来实现进程间通信,而剪贴板自有其缺陷,<br />很显然的是,剪贴板只能在本地机器上实现,<br />无法实现本地进程与远程服务器上的进程之间的通信,<br />那么有没有办法实现本地进程和远程进程的通信呢?<br />办法自然是有的,要是实在搞不出,<br />我拿 Socket 来实现本地进程和远程进程的通信来实现也是可以的,<br />但是你想啊,要用 Socket 来实现本地进

zhuxiufenghust的专栏 597

如何用进行进程间通信

如何用进行进程间通信 蒋东宇<br />  在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,是其中实现单通道进程间通信的一种。创建的进程被称为服务器,而其它发送消息给的进程被称为客户端。客户端能发送消息给本机的,也可发送消息给局域网内其他计算机内的,所有这些消息都存储在内,直到服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数据报的基础上,因此在线路不好时传输质量不可靠。<br /><br />

Augusdi的专栏 1276

进程间通信详解 - 实现

引子 前面的一篇博文介绍了进程之间通信的一种最为简单的方式, 也就是在本地进程之间通过剪贴板来实现进程间通信,而剪贴板自有其缺陷, 很显然的是,剪贴板只能在本地机器上实现, 无法实现本地进程与远程服务器上的进程之间的通信, 那么有没有办法实现本地进程和远程进程的通信呢? 办法自然是有的,要是实在搞不出, 我拿 Socket 来实现本地进程和远程进程的通信

daofengdeba 1360

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

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

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

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

小伟锅的博客 1520

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

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

HeartHelp2013的博客 474

」单向进程间通信——Console程序设计

创建本地—服务端/客户端—进行进程间通讯

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 1151

进程间通信(四):利用

进程间通信(四):利用进程间通信的四种方式1)  剪贴板2)  匿名管道3)  命名管道4)  是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。是一种单向通信机制,创建服务器进程读取数据,打开的客户机进程写入数据。为保证在各种Windows平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在424字节以下。

憩园幽幽的专栏 703
上一篇: 如何实现进程间的通信
下一篇: XP工程移植Vista上找不到msxml.dll错误
ShenRui
博客等级 码龄19年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值