Windows C++ 使用PIPE命名管道实现进程间通讯

简介: 本文章是介绍在Windows下,使用PIPE管道实现进程间通讯,可是实现两个进程之前相互发送读取消息。
+关注继续查看

本文章是介绍在Windows下,使用PIPE管道实现进程间通讯,可是实现两个进程之前相互发送读取消息。


主进程代码

#include "windows.h"
#include <iostream>
using namespace std;
#define BUF_SIZE 4096
// 定义管道名 , 如果是跨网络通信 , 则在圆点处指定服务器端程序所在的主机名
#define EXAMP_PIPE   L"\\\\.\\PIPE\\EB3F2E4B_52E2_40F9_A17D_B4A2588F23AB"   
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
    // 创建命名管道
    HANDLE hPipe = NULL;
    hPipe = CreateNamedPipe(
        EXAMP_PIPE,
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE |
        PIPE_READMODE_MESSAGE |
        PIPE_WAIT,
        PIPE_UNLIMITED_INSTANCES,
        BUF_SIZE,
        BUF_SIZE,
        0,
        NULL);
    if (hPipe == INVALID_HANDLE_VALUE)
    {
        cout << "Create Read Pipe Error" << endl;
        return FALSE;
    }
    cout << "Wait for the connection" << endl;
    // 等待客户端的连接
    if (!ConnectNamedPipe(hPipe, NULL))
    {
        cout << "Connect Failed" << endl;
        return FALSE;
    }
    DWORD dwReturn = 0;
    char szBuffer[BUF_SIZE] = { 0 };
    // 向客户端发送数据
    cout << "Wait for input" << endl;
    cin >> szBuffer;
    if (!WriteFile(hPipe, szBuffer, strlen(szBuffer), &dwReturn, NULL))
    {
        cout << "Write Failed" << endl;
    }
    // 读取客户端数据
    memset(szBuffer, 0, BUF_SIZE);
    if (ReadFile(hPipe, szBuffer, BUF_SIZE, &dwReturn, NULL))
    {
        szBuffer[dwReturn] = '\0';
        cout << szBuffer << endl;
    }
    else
    {
        cout << "Read Failed" << endl;
    }
    DisconnectNamedPipe(hPipe);
    CloseHandle(hPipe);
    return 0;
}



子进程代码

#include "windows.h"
#include <iostream>
using namespace std;
#define BUF_SIZE 4096
// 定义管道名 , 如果是跨网络通信 , 则在圆点处指定服务器端程序所在的主机名
#define EXAMP_PIPE   L"\\\\.\\PIPE\\EB3F2E4B_52E2_40F9_A17D_B4A2588F23AB"
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
    HANDLE hPipe = NULL;
    char  szBuffer[BUF_SIZE] = { 0 };
    DWORD dwReturn = 0;
    // 判断是否有可以利用的命名管道  
    if (!WaitNamedPipe(EXAMP_PIPE, NMPWAIT_USE_DEFAULT_WAIT))
    {
        cout << "No Read Pipe Accessible" << endl;
        return 0;
    }
    // 打开可用的命名管道 , 并与服务器端进程进行通信  
    hPipe = CreateFile(EXAMP_PIPE, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0, NULL);
    if (hPipe == INVALID_HANDLE_VALUE)
    {
        cout << "Open Read Pipe Error" << endl;
        return 0;
    }
    cout << "Wait for the message" << endl;
    // 读取服务端发来的数据
    if (ReadFile(hPipe, szBuffer, BUF_SIZE, &dwReturn, NULL))
    {
        szBuffer[dwReturn] = '\0';
        cout << szBuffer << endl;
    }
    else
    {
        cout << "Read Failed" << endl;
    }
    // 向服务端发送数据
    memset(szBuffer, 0, BUF_SIZE);
    cin >> szBuffer;
    if (!WriteFile(hPipe, szBuffer, strlen(szBuffer), &dwReturn, NULL))
    {
        cout << "Write Failed" << endl;
    }
    CloseHandle(hPipe);
    return 0;
}

80后程序员

相关文章
|
4天前
|
存储 API 数据库
C/C++ 实现Windows注册表操作
Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。
|
4天前
|
Linux 编译器 C语言
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
32 0
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
|
25天前
|
安全 测试技术 C++
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
最近用到了gRPC,配置了很长时间,分享一下配置过程。先来看一下我准备的文件包(资源我放在最后)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
25天前
|
Windows 存储 Cloud Native
C++Qt windows系统托盘增加图标和功能
C++Qt windows系统托盘增加图标和功能
|
2月前
|
存储 JavaScript Unix
[笔记]c++Windows平台代码规范(下)
[笔记]c++Windows平台代码规范(下)
|
2月前
|
安全 Linux C++
[笔记]c++Windows平台代码规范(上)
[笔记]c++Windows平台代码规范
|
3月前
|
程序员 C++ Windows
Windows C++ 启动子进程并绑定子进程,主进程结束关闭后自动结束关闭子进程
在Windows平台上主进程启动子进程,并使主进程结束关闭后自动结束关闭子进程
49 0
|
4月前
|
网络协议 Linux 编译器
C/C++封装:Windows/Linux下封装.lib/.so文件
这里提供了两个C/C++中服务器与客户端之间通讯的两个程序,程序中封装了通信之间的函数方法,我们以这个程序为例进行封装。
113 0
|
5月前
|
编译器 C语言 C++
01-C++-VSCode配置C++环境(windows)
01-C++-VSCode配置C++环境(windows)
|
6月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
相关产品
云迁移中心
推荐文章
更多