C++命名管道的使用

服务端

// Pipe_Test.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
#include<ctime>
#include<iostream>
#pragma warning(disable:4996)
int main()
{
	srand(time(NULL));

	char buf[256];
	DWORD rlen = 0;
	float * dataT = new float[4];
	HANDLE hPipe = CreateNamedPipe(
		TEXT("\\\\.\\Pipe\\mypipe"),						//管道名
		PIPE_ACCESS_DUPLEX,									//管道类型 
		PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,	//管道参数
		PIPE_UNLIMITED_INSTANCES,							//管道能创建的最大实例数量
		0,													//输出缓冲区长度 0表示默认
		0,													//输入缓冲区长度 0表示默认
		NMPWAIT_WAIT_FOREVER,								//超时时间
		NULL);													//指定一个SECURITY_ATTRIBUTES结构,或者传递零值.
	if (INVALID_HANDLE_VALUE == hPipe)
	{
		printf("Create Pipe Error(%d)\n", GetLastError());
	}
	else
	{
		printf("Waiting For Client Connection...\n");
		if (ConnectNamedPipe(hPipe, NULL) == NULL)	//阻塞等待客户端连接。
		{
			printf("Connection failed!\n");
		}
		else
		{
			printf("Connection Success!\n");
		}

		while (true)
		{
			if (ReadFile(hPipe, dataT, 4*sizeof(dataT), &rlen, NULL) == FALSE) //接受客户端发送过来的内容
			{
				printf("Read Data From Pipe Failed!\n");
				break;
			}
			else
			{
				
				//printf("From Client: data = %d, size = %d\n", buf, rlen);
				std::cout << "接受到的数据" << dataT[2]<<std::endl;
               

				char wbuf[256];
				//sprintf(wbuf, "%s%d", wbuf, rand() % 1000);
				float* some_data = new float[4];
				some_data[0] = 0.0;
				some_data[1] = 1.0;
				some_data[2] = 2.0;
				some_data[3] = 3.0;

				DWORD wlen = 0;
				//WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0);	//向客户端发送内容
				WriteFile(hPipe, some_data, 4*sizeof(some_data), &wlen, 0);	//向客户端发送内容
				//printf("To Client: data = %s, size = %d\n", wbuf, wlen);
				//std::cout << some_data[2]<<std::flush;
				Sleep(1000);
				delete(some_data);
			}
		}
		CloseHandle(hPipe);//关闭管道
	}


	delete(dataT);
	system("PAUSE");
	return 0;



    return 0;
}

客户端

// Pipe_C.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ctime>
#include <iostream>
#pragma warning(disable:4996)


int main()
{
	srand(time(NULL));

	DWORD wlen = 0;
	Sleep(1000);//等待pipe的创建成功!

	BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER);

	if (!bRet)
	{
		printf("connect the namedPipe failed!\n");
		return 0;
	}

	HANDLE hPipe = CreateFile(			//管道属于一种特殊的文件
		TEXT("\\\\.\\Pipe\\mypipe"),	//创建的文件名
		GENERIC_READ | GENERIC_WRITE,	//文件模式
		0,								//是否共享
		NULL,							//指向一个SECURITY_ATTRIBUTES结构的指针
		OPEN_EXISTING,					//创建参数
		FILE_ATTRIBUTE_NORMAL,			//文件属性(隐藏,只读)NORMAL为默认属性
		NULL);							//模板创建文件的句柄

	if (INVALID_HANDLE_VALUE == hPipe)
	{
		printf("open the exit pipe failed!\n");
	}
	else
	{
		while (true)
		{
			char buf[256];;
			//sprintf(buf, "%s%d", buf, rand() % 1000);
			float * data_a = new float[4];
			data_a[0] = 9;
			data_a[1] = 8;
			data_a[2] = 7;
			data_a[3] = 6;

			

			if (WriteFile(hPipe, data_a, 4*sizeof(data_a), &wlen, 0) == FALSE)	//向服务器发送内容
			{
				printf("write to pipe failed!\n");
				break;
			}
			else
			{
				delete(data_a);
				//printf("To Server: data = %f, size = %d\n", buf, wlen);
	
				float * dataT = new float[4];
				DWORD rlen = 0;
				ReadFile(hPipe, dataT, 4*sizeof(dataT), &rlen, 0);	//接受服务发送过来的内容
				std::cout << "接受到的数据为" << dataT[2] << std::endl;;
				//printf("From Server: data = %s, size = %d\n", rbuf, rlen);
				//std::cout << dataT[3] << std::flush;
				delete(dataT);
				
			}
			Sleep(1000);
		}
		CloseHandle(hPipe);//关闭管道
	}

	system("PAUSE");
	return 0;

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值