原文: C++ 进程间的通讯(一):简单的有名管道实现

--------------------------------------------------

进程间的通讯(一):简单的有名管道实现

 

一 管道简介

命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
其优点是实现起来比较简单方便.
缺点是会使进程之间的代码耦合度增加.并且管道通信只适用于同一台主机上的进程之间通讯.

二 实现代码

Server Code:

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <ctime>
  5. int main(int argc, _TCHAR* argv[])
  6. {
  7. srand(time(NULL));
  8. char buf[256] = "";
  9. DWORD rlen = 0;
  10. HANDLE hPipe = CreateNamedPipe(
  11. TEXT("\\\\.\\Pipe\\mypipe"),                        //管道名
  12. PIPE_ACCESS_DUPLEX,                                 //管道类型
  13. PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,  //管道参数
  14. PIPE_UNLIMITED_INSTANCES,                           //管道能创建的最大实例数量
  15. 0,                                                  //输出缓冲区长度 0表示默认
  16. 0,                                                  //输入缓冲区长度 0表示默认
  17. NMPWAIT_WAIT_FOREVER,                               //超时时间
  18. NULL);                                                  //指定一个SECURITY_ATTRIBUTES结构,或者传递零值.
  19. if (INVALID_HANDLE_VALUE == hPipe)
  20. {
  21. printf("Create Pipe Error(%d)\n",GetLastError());
  22. }
  23. else
  24. {
  25. printf("Waiting For Client Connection...\n");
  26. if(ConnectNamedPipe(hPipe, NULL)==NULL) //阻塞等待客户端连接。
  27. {
  28. printf("Connection failed!\n");
  29. }
  30. else
  31. {
  32. printf("Connection Success!\n");
  33. }
  34. while (true)
  35. {
  36. if(ReadFile(hPipe,buf,256,&rlen,NULL)==FALSE) //接受客户端发送过来的内容
  37. {
  38. printf("Read Data From Pipe Failed!\n");
  39. break;
  40. }
  41. else
  42. {
  43. printf("From Client: data = %s, size = %d\n", buf, rlen);
  44. char wbuf[256] = "";
  45. sprintf(wbuf, "%s%d", wbuf, rand()%1000);
  46. DWORD wlen = 0;
  47. WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0); //向客户端发送内容
  48. printf("To Client: data = %s, size = %d\n", wbuf, wlen);
  49. Sleep(1000);
  50. }
  51. }
  52. CloseHandle(hPipe);//关闭管道
  53. }
  54. system("PAUSE");
  55. return 0;
  56. }

Clietn Code:

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <ctime>
  5. int main(int argc, _TCHAR* argv[])
  6. {
  7. srand(time(NULL));
  8. DWORD wlen = 0;
  9. Sleep(1000);//等待pipe的创建成功!
  10. BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER);
  11. if (!bRet)
  12. {
  13. printf("connect the namedPipe failed!\n");
  14. return 0;
  15. }
  16. HANDLE hPipe=CreateFile(            //管道属于一种特殊的文件
  17. TEXT("\\\\.\\Pipe\\mypipe"),    //创建的文件名
  18. GENERIC_READ | GENERIC_WRITE,   //文件模式
  19. 0,                              //是否共享
  20. NULL,                           //指向一个SECURITY_ATTRIBUTES结构的指针
  21. OPEN_EXISTING,                  //创建参数
  22. FILE_ATTRIBUTE_NORMAL,          //文件属性(隐藏,只读)NORMAL为默认属性
  23. NULL);                          //模板创建文件的句柄
  24. if (INVALID_HANDLE_VALUE == hPipe)
  25. {
  26. printf("open the exit pipe failed!\n");
  27. }
  28. else
  29. {
  30. while(true)
  31. {
  32. char buf[256] = "";
  33. sprintf(buf,"%s%d",buf,rand()%1000);
  34. if(WriteFile(hPipe,buf,sizeof(buf),&wlen,0)==FALSE) //向服务器发送内容
  35. {
  36. printf("write to pipe failed!\n");
  37. break;
  38. }
  39. else
  40. {
  41. printf("To Server: data = %s, size = %d\n", buf, wlen);
  42. char rbuf[256] = "";
  43. DWORD rlen = 0;
  44. ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);  //接受服务发送过来的内容
  45. printf("From Server: data = %s, size = %d\n", rbuf, rlen);
  46. }
  47. Sleep(1000);
  48. }
  49. CloseHandle(hPipe);//关闭管道
  50. }
  51. system("PAUSE");
  52. return 0;
  53. }

【转】C++ 进程间的通讯(一):简单的有名管道实现的更多相关文章

  1. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...

  2. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

  3. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  4. .Net下的进程间的通讯 -- Windows消息队列

    Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...

  5. AIDL机制实现进程间的通讯实例

    转载自:http://blog.csdn.net/cjjky/article/details/7562652 ======================================= 在Andr ...

  6. 进程间的通讯————IPC

    """ IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放 ...

  7. 进程之间的通讯Queue简单应用

    #进程间通讯--Queue #Process有时需要通信的,操作系统提供了很多机制来实现进程之间的通讯 #而Queue就是其中一个 #1.Queue的使用 #可以使用multiprocessing模块 ...

  8. python进程间的通讯实现

    1:进程间通讯的方法:apply_async()非阻塞式通讯     apply()阻塞式通讯 2:使用Queue实现对Process创建的进程间通讯, Queue本身是一个消息队列程序,Queue常 ...

  9. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

随机推荐

  1. 认知升级x

    写作目的 今天公司组织了一场关于认知升级的培训讲座,请的主管运营和发行的VP大神,收获颇多,亟待消化.这篇文章可以作为自己课后的一个笔记,自己可以反思,进而同步至团队,大家共同成长. 对于机会的认识 ...

  2. 6-Java-C(打印大X)

    题目描述: 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度. 为了便于比对空格,所有的空白位置都以句点符来代替. 要求输入两个整数m n,表示笔的宽度,X的高度.用空格分开 ...

  3. NLog小记

    NLog安装: Install-Package NLog NLog配置: <?xml version="1.0" encoding="utf-8" ?&g ...

  4. CPU怎么计算1+1----CPU计算的电路基础

    从<十进制和二进制的运算---我所理解到的人类的运算的本质>这里我们知道,人类进行运算的本质是查表,并且我们存储的表是有限的.那么计算机是怎进行四则运算的呢,也是查表吗,肯定不是,今天,我 ...

  5. python清除字符串中无用字符

    将列表val_list中包含的非法字符去掉,illegal_char是非法字符列表 def clear(): illegal_char = [' ','#','%','_','@'] tmp_list ...

  6. [笔记] APIO 2018 Day1

    计算折纸 computaional origami 全息算法(???) margulis napkin problem 素数里有任意长的等差数列 xor gate Σxi or gate(exact ...

  7. 两种js下载文件的方法(转)

    function DownURL(strRemoteURL, strLocalURL){ try{ var xmlHTTP = new ActiveXObject("Microsoft.XM ...

  8. thinkphp 5.0整合阿里大于验证码短信发送接口,含完整模型验证实例DEMO

    为大家分享一个阿里大于短信发送接口: 首先创建一个发送模型(Send.php): <?php namespace app\index\model; use think\Validate; cla ...

  9. 用ffmpeg切割音频文件

    ffmpeg -i audio.wav -f segment -segment_time -c copy audio%02d.wav "-segment_time 60" 表示每6 ...

  10. Nginx的初识

    今日刚接触了解到Nginx的反向代理,正向代理,并发,集群,同个站点不同域名的解析访问等等. 1.反向代理:Nginx充当一个桥接的作用,对用户和服务端进行链接,进行服务端的代理,这样有什么好处: a ...