前面已经使用邮槽实现过进程间通信:http://www.cnblogs.com/jzincnblogs/p/5192654.html ,这里使用命名管道实现进程间通信。

  与邮槽不同的是,命名管道在进程间传输数据是基于连接且可靠的传输方式,所以命名管道传输数据只能一对一。使用命名管道的步骤如下:

  ①创建命名管道,命名管道通过调用函数CreateNamedPipe()创建,函数原型如下:

  1. HANDLE WINAPI CreateNamedPipe(
  2. _In_ LPCTSTR lpName,
  3. _In_ DWORD dwOpenMode,
  4. _In_ DWORD dwPipeMode,
  5. _In_ DWORD nMaxInstances,
  6. _In_ DWORD nOutBufferSize,
  7. _In_ DWORD nInBufferSize,
  8. _In_ DWORD nDefaultTimeOut,
  9. _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
  10. );

  各参数的设置方法可参考MSDN:https://msdn.microsoft.com/zh-cn/biztalk/aa365150(v=vs.80)

  ②连接命名管道。当用户成功创建命名管道后便可调用相关函数连接命名管道,对于服务器而言,可以调用函数ConnectNamedPipe()等待客户端的连接请求,函数原型如下:

  1. BOOL WINAPI ConnectNamedPipe(
  2. _In_ HANDLE hNamedPipe,
  3. _Inout_opt_ LPOVERLAPPED lpOverlapped
  4. );

  参数的设置方法:https://msdn.microsoft.com/zh-cn/biztalk/aa365150(v=vs.80)

  对于客户端而言,在连接服务器创建的命名管道前需要判断该命名管道是否可用,可调用函数WaitNamedPipe()实现,函数使用方法可参考MSDN:https://msdn.microsoft.com/zh-cn/subscriptions/aa365800

  当WaitNamedPipe()调用成功后,便可使用CreateFile()将命名管道打开已获得管道的句柄。

  ③读写命名管道,对命名管道的读写操作利用函数ReadFile()和WriteFile()完成,与上一篇的邮槽类似。

  服务器和客户端的实现代码如下:

  服务器端:

  1. //server
  2. //命名管道采用基于连接的可靠传输方式,只能一对一传输
  3. #include <windows.h>
  4. #include <iostream>
  5.  
  6. #define BUF_SIZE 1024
  7.  
  8. using std::cerr;
  9. using std::cout;
  10. using std::endl;
  11.  
  12. int main()
  13. {
  14. HANDLE h_pipe;
  15. char buf_msg[BUF_SIZE];
  16. DWORD num_rcv; //实际接收到的字节数
  17. //创建命名管道,命名为MyPipe,消息只能从客户端流向服务器,读写数据采用阻塞模式,字节流形式,超时值置为0表示采用默认的50毫秒
  18. h_pipe = ::CreateNamedPipe("\\\\.\\pipe\\MyPipe", PIPE_ACCESS_INBOUND, PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUF_SIZE, BUF_SIZE, , nullptr);
  19. if (h_pipe == INVALID_HANDLE_VALUE)
  20. {
  21. cerr << "Failed to create named pipe!Error code: " << ::GetLastError() << "\n";
  22. system("pause");
  23. return ;
  24. }
  25. else
  26. {
  27. cout << "Named pipe created successfully...\n";
  28. }
  29. //等待命名管道客户端连接
  30. if (::ConnectNamedPipe(h_pipe, nullptr))
  31. {
  32. cout << "A client connected...\n";
  33. memset(buf_msg, , BUF_SIZE);
  34. //读取数据
  35. if (::ReadFile(h_pipe, buf_msg, BUF_SIZE, &num_rcv, nullptr))
  36. {
  37. cout << "Message received: " << buf_msg << "\n";
  38. }
  39. else
  40. {
  41. cerr << "Failed to receive message!Error code: " << ::GetLastError() << "\n";
  42. ::CloseHandle(h_pipe);
  43. ::system("pause");
  44. return ;
  45. }
  46. }
  47. ::CloseHandle(h_pipe);
  48. ::system("pause");
  49. return ;
  50. }

  客户端:

  1. //client
  2. #include <windows.h>
  3. #include <iostream>
  4.  
  5. #define BUF_SIZE 1024
  6.  
  7. using std::cerr;
  8. using std::cout;
  9. using std::endl;
  10.  
  11. int main()
  12. {
  13. HANDLE h_pipe;
  14. char buf_msg[] = "Test for named pipe...";
  15. DWORD num_rcv; //实际接收到的字节数
  16. cout << "Try to connect named pipe...\n";
  17. //连接命名管道
  18. if (::WaitNamedPipe("\\\\.\\pipe\\MyPipe", NMPWAIT_WAIT_FOREVER))
  19. {
  20. //打开指定命名管道
  21. h_pipe = ::CreateFile("\\\\.\\pipe\\MyPipe", GENERIC_WRITE, , nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
  22. if (h_pipe == INVALID_HANDLE_VALUE)
  23. {
  24. cerr << "Failed to open the appointed named pipe!Error code: " << ::GetLastError() << "\n";
  25. ::system("pause");
  26. return ;
  27. }
  28. else
  29. {
  30. if (::WriteFile(h_pipe, buf_msg, BUF_SIZE, &num_rcv, nullptr))
  31. {
  32. cout << "Message sent successfully...\n";
  33. }
  34. else
  35. {
  36. cerr << "Failed to send message!Error code: " << ::GetLastError() << "\n";
  37. ::CloseHandle(h_pipe);
  38. ::system("pause");
  39. return ;
  40. }
  41. }
  42. ::CloseHandle(h_pipe);
  43. }
  44. ::system("pause");
  45. return ;
  46. }

c++下使用命名管道实现进程间通信的更多相关文章

  1. 命名管道实现进程间通信--石头、剪刀、布游戏 分类: linux 2014-06-01 22:50 467人阅读 评论(0) 收藏

    下面这个程序利用命名管道实现进程间通信,模拟石头剪刀布游戏. 主进程为裁判进程,两个子进程为选手进程.裁判与选手间各建立一个命名管道. 进行100次出招,最后给出游戏胜负. #include < ...

  2. Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()

    在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...

  3. Linux进程间通信-命名管道

    前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...

  4. Linux系统编程——进程间通信:命名管道(FIFO)

    命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...

  5. Linux进程间通信——使用命名管道

    在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...

  6. Linux环境进程间通信(一):管道及命名管道

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  7. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  8. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  9. Windows进程间通信—命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将 ...

随机推荐

  1. mysql left join中where和on条件的区别

    left join中关于where和on条件的几个知识点: 1.多表left join是会生成一张临时表,并返回给用户 2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件 ...

  2. 20145216《java程序设计》课程总结

    20145216<java程序设计>课程总结 每周读书笔记链接汇总 第一周学习总结 20145216<java程序设计>第一周总结 第二周学习总结 20145216<ja ...

  3. 2017阿里C++研发工程师-校招-笔试模拟

    题目描述: 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生00下一对小兔,之后开始每年都会生下一对小兔.生下的小兔又会以同样的方式继续繁殖. 兔子的寿命都是x(x>=3) ...

  4. IT最新最火的网络词汇*2*(文章来源电商)

          P2P.P2C .O2O .B2C.B2B.C2C等等最新最火的网络用词直接将我们都弄晕了,特此今天将这些划时代意义的词汇总结起来,若有什么不足之处,希望各位评论指正. 大致意思为: 1. ...

  5. php7安装Memcached扩展

    要安装 memcached,需要先安装依赖库 libmemcached wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/lib ...

  6. 怎样让.bat文件直接运行不需要右键管理员权限

    :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2&g ...

  7. 4.9版本的linux内核中实时时钟芯片pcf85263的驱动源码在哪里

    答:drivers/rtc/rtc-pcf85263.c,内核配置选项为 CONFIG_RTC_DRV_PCF85263 Location: -> Device Drivers -> Re ...

  8. SaltStack使用salt-ssh模式-第十一篇

    salt-ssh介绍 1.salt-ssh 是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也不需要master. 2.salt-ssh 支持salt大部分的功能:如 grai ...

  9. Windows窗体应用程序常用的几个类的属性、方法以及事件

    System.Diagnostics.Process 属性 public bool EnableRaisingEvents { get; set; }//获取或设置在进程终止时是否应激发 Exited ...

  10. hdu1009 - 贪心

    2017-07-14 18:18:31 writer:pprp 介绍:hdu1009 题目介绍,详见hdu1009 代码如下 #include <iostream> #include &l ...