我是靠谱客的博主 包容石头,最近开发中收集的这篇文章主要介绍C++管道的例子——服务端与客户端通信,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、流程

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 ) --nn");

	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("具体数据内容如下:%sn", 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 ) --nn");

	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("具体数据内容如下:%sn", 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++管道的例子——服务端与客户端通信的全部内容,希望文章能够帮你解决C++管道的例子——服务端与客户端通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部