服务端:
(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;
}