命名管道

服务端:

(1)CreateNamedPipe返回句柄,两种类型message或者是字节流

(2)ConnectNamedPipe函数等待客户端连接,阻塞在此函数上

(3)有客户端连入以后,会继续向下执行,使用ReadFile\WriteFile来发送和接收数据。

(4)使用DisconnectNamedPipe关闭命名管道、再使用ClosheHandle关闭句柄

客户端:

(1)使用WaitNamedPipe函数等待命名管道的服务器创建,阻塞模式,有检测到有此命名管道后,则继续向下执行。

(2)使用CreateFile将命名管道打开。设置操作的权限

(3)使用ReadFile、WriteFile进行命名管道的读写

(4)使用DisconnectNamedPipe关闭命名管道、再使用ClosheHandle关闭句柄


代码:

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

#include "stdafx.h"
#include "TestPipe.h"
#include <iostream>
#include <string>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

bool g_isServer = true;

static TCHAR* ServerPipeName = L"\\\\.\\pipe\\ISServerIsPipeName";

enum{
	PIPE_SET_START = 0,
	PIPE_SET_STOP,
	PIPE_GET_SERVICE_STATUS
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		_tprintf(_T("错误: MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
	}

	cout<<"y or n ?"<<endl;

	char c = getchar();

	(c == 'y') ? (g_isServer = true) : (g_isServer = false);

	if (g_isServer)
	{
		cout<<"pipe server have started: "<<endl;


		HANDLE hServerPipe = CreateNamedPipe(ServerPipeName,PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE,1,0,0,1000,NULL);
		if (hServerPipe == INVALID_HANDLE_VALUE)
		{
			MessageBox(NULL,L"server CreateNamedPipe Error",L"",MB_OK);
			return -1;
		}

		if (ConnectNamedPipe(hServerPipe,NULL) == FALSE )
		{
			CloseHandle(hServerPipe);
			MessageBox(NULL,L"server ConnectNamedPipe Error",L"",MB_OK);
			return -1;
		}

		while(1)
		{
			//read

			CHAR szBuf[MAX_PATH];
			ZeroMemory(szBuf,sizeof(CHAR)*MAX_PATH);
			DWORD dwReq;

			if (ReadFile(hServerPipe,szBuf,sizeof(szBuf),&dwReq,NULL) == FALSE)
			{
				CloseHandle(hServerPipe);
				MessageBox(NULL,L"server ReadFile Error",L"",MB_OK);
				return -1;

			}else
			{
				szBuf[dwReq] = L'\0';
				cout<<"ServerRead data:"<<szBuf<<endl;
			}
			//
			string sSend;
			CHAR szSend[MAX_PATH];
			ZeroMemory(szSend,sizeof(CHAR)*MAX_PATH);

			cin>>szSend;
			sSend.assign(szSend);
			DWORD dwSendLen;

			if (WriteFile(hServerPipe,sSend.c_str(),sSend.length(),&dwSendLen,NULL) == FALSE)
			{
				CloseHandle(hServerPipe);
				MessageBox(NULL,L"Server WriteFile Error",L"",MB_OK);			
				return -1;
			}

		}//while..
		
		//close
		if (DisconnectNamedPipe(hServerPipe))
		{
			CloseHandle(hServerPipe);
			MessageBox(NULL,L"server DisconnectNamedPipe OK",L"",MB_OK);
		}

	}else
	{
		cout<<"pipe client wait for start: "<<endl;
		while(1)
		{
			if (WaitNamedPipe(ServerPipeName,2000/*NMPWAIT_WAIT_FOREVER*/))
			{
				break;
			}
		}
		
		cout<<"pipe client have started: "<<endl;

		HANDLE hClientPipe = CreateFile(ServerPipeName,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		if (hClientPipe == INVALID_HANDLE_VALUE)
		{
			MessageBox(NULL,L"client CreateFile open pipe Error",L"",MB_OK);
			return -1;
		}


		while (1)
		{
			string sSend;
			CHAR szSend[MAX_PATH];
			ZeroMemory(szSend,sizeof(CHAR)*MAX_PATH);

			cin>>szSend;
			sSend.assign(szSend);
			DWORD dwSendLen;

			if (WriteFile(hClientPipe,sSend.c_str(),sSend.length(),&dwSendLen,NULL) == FALSE)
			{
				CloseHandle(hClientPipe);
				MessageBox(NULL,L"client WriteFile Error",L"",MB_OK);			
				return -1;
			}

			//
			CHAR szBuf[MAX_PATH];
			ZeroMemory(szBuf,sizeof(CHAR)*MAX_PATH);
			DWORD dwReq;

			if (ReadFile(hClientPipe,szBuf,sizeof(szBuf),&dwReq,NULL) == FALSE)
			{
				CloseHandle(hClientPipe);
				MessageBox(NULL,L"server ReadFile Error",L"",MB_OK);
				return -1;

			}else
			{
				szBuf[dwReq] = L'\0';
				cout<<"Client Read data:"<<szBuf<<endl;
			}
		}
		

		CloseHandle(hClientPipe);
	}



	return nRetCode;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值