返回顶部

收藏

邮槽实现进程间通讯

更多

邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽是一种单向通信机制,创建邮槽的服务器进程读取 数据,打开邮槽的客户机进程写入数据 为保证邮槽在各种Windows平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在424字节以下 邮槽提供一种进程间 通讯能力的方法。任何进程都可以创建一个邮槽,并成为一个邮槽服务器。其它调用邮槽的客户机进程能够通过邮槽名获得对这个邮槽的访问,并发送消息到邮槽服 务器上。一 个进程即可以当作邮槽服务器,也可以当作邮槽客户机,所以用多个邮槽来实现双向进程间通讯是可能的。引入的信息经常被添加到邮槽中。邮槽保存这个消息直到创建进程有机 会去读取它们。除了为了有稍许简单 化设计界面和附件在指定的网络域中为了在全部计算机中实现广播传送消息的能力之外,邮槽类似于命名管道。一个邮槽客户机能够发送消息到向一个本地计算机上 的一个邮槽 上,或者发送到其它计算机上的一个邮槽上,或者发送到在指定计算机区域中同名的全部邮槽上。广播到域上的消息不能够超过400个字节;被发送到一个单一的邮槽上的消息 长度仅被限定在创建邮槽的人指定的最大消息长度。关键点:邮槽为应用程序提供一种简易的发送和接受简短信息的方法。它们也提供了一种在指定网络区域中全部计算机间的广 播式传播能力。什么叫做邮槽?邮槽是一种为了进程间通讯方法的机制。一个使用微软Windows写的应用程序能够在邮槽中存储消息。邮槽的拥有者能够重新找回被存储在 邮槽中的消息。典型地,这些消息可以通过一个网络被发送到一个指定的计算机上或者在一个指定网络区域中的全部计算机上。这个域往往是一个工作站或者是一个共享一个组名 的服务器。邮槽的命名当一个进程创建一个邮槽,这个邮槽的名称必须按照以下格式://./mailslot/[path]name。一个邮槽名称需要这些元素:两个反 斜杠去开始,一个句点,一个反斜杠跟在句点后,“mailslot”这个关键词和一个反斜杠,但是这些多试不重要的。一个邮槽名前可能加上一个被反斜杠分割的一个或多 个伪仿的目录所组成的路径。例如:如果一个用户期望从Bob,Pete和Sue的Taxes消息,这个用户邮槽的应用程序可能允许这个用户去创建单独的邮槽为了各个发 送者。//.mailsolt/taxes/bobs_commnets//.mailsolt/taxes/petes_commnets//.mailsolt/ taxes/sues_commnets放入消息到一个邮槽中,一个进程需要打开一个已被命名的邮槽。在本地计算机上往邮槽中写信息,进程就必须要使用创建一个同名的 邮槽。但是,这种情况很少。大部分情况下,一个进程用以下格式去写到一个指定的远程计算机上的邮槽上。//computername/mailsolt/[path] name在一个给定域名的域中,向每个邮槽中放入消息时,采用以下格式://domainname/mailslot/[path]name在系统主要域中,往一个已 有名字的每个邮槽中放入信息,进程可以采用以下格式://*/mailslot/[path]name邮槽对象通过CreateMailslot函数返回的句柄拥有G ENERIC_READ,SYNCHRONIZE和WRITE_DAC邮槽对象的访问权。对于邮槽的GENERIC_READ访问权凝聚了STANDARD_RIGH TS_READ为了允许进程从邮槽中读数据,读邮槽的属性和读扩展属性。邮槽函数CreateMailslot函数原型:HANDLE CreateMailslot(LPCTSTR lpName, DWORD nMaxMessageSize, DWORD lReadTimeout, LPSECURITY_ATTRIBUTES lpSecurityAttributes);说明:创建一个邮路。返回的句柄由邮路服务器使用(收件人)返回值:Lo ng,如执行成功,返回邮路的句柄;INVALID_HANDLE_VALUE表示失败。会设置GetLastError参数:lpName:LPCTSTR,指定邮 路的名字,采用的形式如下://./邮路/[路径/]邮路名nMaxMessageSize:DWORD,指定一个邮路消息的最大长度。零表示无限长。请注意,对于穿 越一个网络域到多个邮路的广播消息,最大长度是400lReadTimeout:DWORD,等待指定的数据时,用这个参数指定邮路使用的默认超时设置,以毫秒为单位 。零表示不等待。常数MAILSLOT_WAIT_FOREVER表示一直等到数据到达lpSecurityAttributes:LPSECURITY_ATTRI BUTES,指定一个结构,或传递零值,表示使用不允许继承的默认描述符GetMailslotInfo函数原型:BOOL GetMailslotInfo(HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout);说明:获取与一个邮路有关的信息返回值: Long,非零表示成功,零表示失败。会设置GetLastError参数:hMailslot:HANDLE,指定一个邮路的句柄lpMaxMessageSize :LPDWORD,指定一个长整数变量,用于装载这个邮路的最大消息长度lpNextSize:LPDWORD,指定一个长整数变量,用于装载下一条消息的长度。如没 有消息准备好,则可设为常数MAILSLOT_NO_MESSAGElpMessageCount:LPDWORD,指定一个长整数变量,用于装载邮路中准备好的消息 数量lpReadTimeout:LPDWORD,指定一个长整数变量,用于装载邮路的默认阅读超时SetMailslotInfo函数原型:BOOL SetMailslotInfo(HANDLE hMailslot, DWORD lReadTimeout);说明:设置对一个邮槽读操作的时间。返回值:如果函 数成功,返回值非零;如果函数执行失败,返回值为零。扩展错误信息通过GetLastError函数获得。参数:hMailslot:通过CreateMailslo t函数创建的识别一个邮槽的句柄hReadTimeout:按照毫秒,指定时间量。在占休时间前,一个读操作等候着被写入邮槽中的消息。以下值有特定含义:1. 0:如果当前没有消息,则立即返回。系统不处理及时返回的错误。2. MAILSLOT_WAIT_FOREVER:永远等候着一个消息。这个占休时间将应用与全部的并发读操作和全部被继承的邮槽处理。额外的邮槽服务器使用函数:1. DuplicateHandle;复制邮槽句柄。2. ReadFile:从邮槽中返回消息。3. GetFileTime:返回一个邮槽被创建的日期和时间。4. SetFileTime:设置一个邮槽被创建的日期和时间。

服务器端

       void OnMailslotRecv()
       {
              HANDLE hMail;
              HMail = CreateMailslot(“////.//mailslot//MyMail”,0,MAILSLOT_VAIT_FOREVER,NULL);
              If (INVALID_HANDLE_VALUE==hMail)
              {
                     MessageBox(“Create Mailslot failed!”);
                     Return;
              }
              char buf[100] = “0”;
              DWORD dwRead;
              If (!ReadFile(hMail, buf, 100, &dwRead, NULL))
              {
                     MessageBox(“Failed read data from file!”)
                     CloseHandle(hMail);
                     Return;
              }
              MessageBox(buf);
              CloseHandle(hMail);
       }

客户端

       void OnMailslotSend()
       {
              HANDLE hMail;
                                      hMail = CreateFile(////.//mailslot//MyMail,
              GENERIC_READ,
              FILE_SHARE_READ,
              NULL,
              OPEN_EXISTING,
              FILE_ATTRIBUTE_NORMAL,
              NULL);
              If (INVALID_HANDLE_VALUE==hMail)
              {
                     MessageBox(“Open mailslot failed!”);
                     Return;
              }
              char buf[100] = “Mailslot test Program!”;
              DWORD dwWrite;
              If (!ReadFile(hMail, buf, 100, & dwWrite, NULL))
              {
                     MessageBox(“Failed write data to file!”)
                     CloseHandle(hMail);
                     Return;
              }
              CloseHandle(hMail);
       }

标签:c++

收藏

1人收藏

支持

1

反对

0

»更多 您可能感兴趣的代码
  1. 2017-07-23 12:42:20奇数魔方阵 by Kevin.
  2. 2017-07-18 14:15:24两种方法计算“算术表达式” by aiheng1988
  3. 2015-09-09 16:29:06将jpg转换为bmp格式的文件 by qqmmcc
  4. 2015-09-09 09:29:49可执行文件加密 by walker30
  5. 2015-09-08 18:42:46TCP端口占用查询 by 灵剑子
  6. 2015-09-08 14:16:34Luffar schack五子棋 by 蟋蟀哥
  7. 2015-09-08 10:39:34wav转mp3的程序 by 灵剑子
  8. 2015-09-05 16:54:59逐行搜索目录中的文件内容并输出到Excel by 蟋蟀哥
  9. 2015-09-03 20:10:15LZW+AES+Base64编码解码剪贴板文本 by 童学芬
  10. 2015-09-01 17:47:21猫里奥 by aiheng1988
  11. 2015-08-31 15:33:59模拟键盘操作发送字符串 by 千万不要郁闷

发表评论