管道是进程用于通信的共享内存的一部分。 创建管道的过程是 管道服务器。 连接到管道的进程是 管道客户端。 一个进程将信息写入管道,另一个进程从管道读取信息。 本概述介绍如何创建、管理和使用管道。
命名管道是用于管道服务器与一个或多个管道客户端之间通信的命名、单向或双工管道。 命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。 通过使用实例,多个管道客户端可以同时使用同一个命名管道。
任何进程都可以访问命名管道,受到安全检查,使命名管道成为相关或不相关进程之间通信的简单形式。
任何进程都可以充当服务器和客户端,使对等通信成为可能。 在此处使用,术语管道服务器是指创建命名管道的进程,术语管道客户端是指连接到命名管道实例的进程。 用于实例化命名管道的服务器端函数是 CreateNamedPipe。 用于接受连接的服务器端函数是 ConnectNamedPipe。 客户端进程使用 CreateFile 或 CallNamedPipe 函数连接到命名管道。
注意:
客户端代码
#include
#include
#include
#include "windows.h"
#include "stdio.h"
using namespace std;
#define PIPE_NAME L"\\\\.\\Pipe\\test"
void main()
{
char buffer[1024];
DWORD WriteNum;
if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) == FALSE)
{
cout << "等待命名管道实例失败!" << endl;
return;
}
HANDLE hPipe = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
cout << "创建命名管道失败!" << endl;
CloseHandle(hPipe);
return;
}
cout << "与服务器连接成功!" << endl;
//std::istringstream input);
string str;
while (1)
{
getline(cin, str);//等待数据输入
if (WriteFile(hPipe, str.c_str(), strlen(str.c_str()), &WriteNum, NULL) == FALSE)
{
cout << "数据写入管道失败!" << endl;
break;
}
}
cout << "关闭管道!" << endl;
CloseHandle(hPipe);
system("pause");
}
服务器端代码
#include "iostream"
#include "windows.h"
using namespace std;
#define PIPE_NAME L"\\\\.\\Pipe\\test"
void main()
{
char buffer[1024];
DWORD ReadNum;
HANDLE hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
cout << "创建命名管道失败!" << endl;
CloseHandle(hPipe);
return;
}
if (ConnectNamedPipe(hPipe, NULL) == FALSE)
{
cout << "与客户机连接失败!" << endl;
CloseHandle(hPipe);
return;
}
cout << "与客户机连接成功!" << endl;
while (1)
{
if (ReadFile(hPipe, buffer, 1024, &ReadNum, NULL) == FALSE)
{
cout << "读取数据失败!" << endl;
break;
}
buffer[ReadNum] = 0;
cout << "读取数据:" << buffer << endl;
}
cout << "关闭管道!" << endl;
CloseHandle(hPipe);
system("pause");
}