一、流程

1. 服务端用CreateNamedPipe创建一个命名管道并使用ConnectNamedPipe等待客户端的连接。

2. 客户端使用WaitNamedPipe连接成功后,用CreateFile打开管道并使用WriteFile向管道中写入一段数据(即向服务端发送消息)。

3. 服务端使用ReadFile从管道中读取数据后(即收到消息)再向管道中写入确认信息表明已经收到客户端传输的数据(即通知客户端已收到)。

4. 客户端收到确认信息后结束,调用CloseHandle关闭管道(该管道是CreateFile打开的)。

5.服务端使用DisconnectNamedPipe和CloseHandle关闭管道。

二、实例

先运行服务器,再运行客户端

服务端

// ServicePip.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;#define pStrPipeName  L"\\\\.\\pipe\\NamePipe_MoreWindows"int main()
{printf("        命名管道 服务器\n");printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");printf("创建命名管道并等待连接\n");HANDLE hPipe = CreateNamedPipe(pStrPipeName, PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);if (ConnectNamedPipe(hPipe, NULL) != NULL)//等待连接。{printf("连接成功,开始接收数据\n");const int BUFFER_MAX_LEN = 256;char szBuffer[BUFFER_MAX_LEN];memset(szBuffer, 0, BUFFER_MAX_LEN);DWORD dwLen;//接收客户端发送的数据ReadFile(hPipe, szBuffer, BUFFER_MAX_LEN, &dwLen, NULL);//读取管道中的内容(管道是一种特殊的文件)printf("接收到数据长度为%d字节\n", dwLen);printf("具体数据内容如下:%s\n", szBuffer);//确认已收到数据,并发送消息给客户端printf("向客户端发送已经收到标志\n");strcpy_s(szBuffer, "服务器已经收到");//服务器发送的消息WriteFile(hPipe, szBuffer, strlen(szBuffer) + 1, &dwLen, NULL);}DisconnectNamedPipe(hPipe);CloseHandle(hPipe);//关闭管道return 0;
}

客户端

#include <iostream>
#include <windows.h>
#include <ctime>
#include <conio.h>
using namespace std;
#define BUFSIZE 5#define pStrPipeName  L"\\\\.\\pipe\\NamePipe_MoreWindows"
int main()
{printf("        命名管道 客户端\n");printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");printf("按任意键以开始连接命名管道\n");_getch();printf("开始等待命名管道\n");if (WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER) == FALSE){printf("Error! 连接命名管道失败\n");return 0;}printf("打开命名管道\n");HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);printf("向服务端发送数据\n");const int BUFFER_MAX_LEN = 256;char szBuffer[BUFFER_MAX_LEN];memset(szBuffer, 0, BUFFER_MAX_LEN);DWORD dwLen = 0;//向服务端发送数据sprintf_s(szBuffer, "进程%d说\"%s\"", GetCurrentProcessId(), "Hello World!");WriteFile(hPipe, szBuffer, strlen(szBuffer) + 1, &dwLen, NULL);printf("数据写入完毕共%d字节\n", dwLen);//接收服务端发回的数据ReadFile(hPipe, szBuffer, BUFFER_MAX_LEN, &dwLen, NULL);//读取管道中的内容(管道是一种特殊的文件)printf("接收服务端发来的确认信息长度为%d字节\n", dwLen);printf("具体数据内容如下:%s\n", szBuffer);CloseHandle(hPipe);system("pause");return 0;
}

参考:

https://blog.csdn.net/morewindows/article/details/7390441

https://blog.csdn.net/MoreWindows/article/details/8260087?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

C++管道的例子——服务端与客户端通信相关推荐

  1. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  2. [笨木头FireFly 03]完整的服务端和客户端通信

    #PS: 其实这篇文件是2013.10.12写完的,一直没发布,因为从那天起,我又跑回去折腾客户端的东西了(打算用Cocos2d-x3.0做下一个游戏),以及我的老游戏的维护和更新.总之各种借口(小若 ...

  3. 多线程服务端和客户端通信

    ❤️强烈推荐人工智能学习网站❤️ 在不同的机器上可以用TCP进行通信,在同一台机器上也可以,用客户端/服务端模式通信耦合度更低,golang示例多线程服务端和客户端通信,用C++写也可以 packag ...

  4. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  5. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  6. java socket 包头包体_使用JAVA上抓取Socket服务端和客户端通信TCP数据包

    使用Java抓取Socket通信TCP数据包 使用WireShark默认使用的是winpcap去抓本地环回的数据包,需要安装npcap再在Wireshark选择本地环回的网卡抓包 在Java-Sock ...

  7. Websocket服务端和客户端通信(WSS、WS)

    前端和后端之间的通讯 一.简介 前端为客户端(Client),后端为服务端(Server) 具体操作步骤为: 1.运行 Server 目录下的 --> WebsocketServerWss_Ws ...

  8. Mina2框架--服务端与客户端通信

    mina服务管理器 package com.zxtx.apps.traffic.server;import org.apache.commons.lang.StringUtils; import or ...

  9. C#GRPC 服务端与客户端通信,故障排除记录

    文章目录 前言 一.问题一解决方法 二.问题二解决方法 前言 第一次建立GRPC服务端,客服端一直通不到服务端: 问题1: One or more errors occurred. (Status(S ...

最新文章

  1. 教您用CT数据和桌面3D打印机打印自己的器官模型
  2. 谷歌论文:使用深度强化学习的芯片布局
  3. java冒泡排序函数验证_java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数...
  4. mysql 储存过程
  5. SQL Developer更改日期显示格式
  6. C# 6.0的字典(Dictionary)的语法
  7. 王道计算机考研 计算机组成原理 第一章、计算机系统概述
  8. access 更新整列数据_在access中同一列的多个数据一次更新
  9. java模式匹配_用Java匹配模式
  10. python提速qq邮箱邮件_python3通过qq邮箱发送邮件
  11. 定义枚举类型时指定其使用的大小 (C++,C#)
  12. HttpServletRequest即很多代码中的request对象
  13. PHP中preg_match_all正则匹配出需要的内容
  14. vfp中写入文本文件_VFP中操作多种文件
  15. java实现zip文件压缩和解压
  16. 下拉推荐在 Shopee Chatbot 中的探索和实践
  17. uefi模式安装windows10和deepin
  18. 流媒体技术介绍(上)
  19. 利用迭代公式求平方根。
  20. 浅谈Linux就业前景

热门文章

  1. 电信、联通双线上网配置
  2. 废旧手机秒变PHP服务,轻松拥有随身服务器
  3. Common Part
  4. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
  5. chrono 库的用途
  6. jfreechart java配置_JFREECHART环境安装配置
  7. CreateMutex、WaitForSingleObject、ReleaseMutex
  8. 读博士可能后悔四年,不读博士可能后悔一辈子
  9. 我去!这也太牛了,滴滴大牛都叹服的Java并发原理,深入剖析JDK源码!
  10. 海潮改正matlab,转:SPOTL(一些海潮负载程序):-安装说明