• WIN32API之PIPE管道


     管道是进程用于通信的共享内存的一部分。 创建管道的过程是 管道服务器。 连接到管道的进程是 管道客户端。 一个进程将信息写入管道,另一个进程从管道读取信息。 本概述介绍如何创建、管理和使用管道。

    命名管道是用于管道服务器与一个或多个管道客户端之间通信的命名、单向或双工管道。 命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。 通过使用实例,多个管道客户端可以同时使用同一个命名管道。

    任何进程都可以访问命名管道,受到安全检查,使命名管道成为相关或不相关进程之间通信的简单形式。

    任何进程都可以充当服务器和客户端,使对等通信成为可能。 在此处使用,术语管道服务器是指创建命名管道的进程,术语管道客户端是指连接到命名管道实例的进程。 用于实例化命名管道的服务器端函数是 CreateNamedPipe。 用于接受连接的服务器端函数是 ConnectNamedPipe。 客户端进程使用 CreateFile 或 CallNamedPipe 函数连接到命名管道。

    注意:

    • 命名管道的名称在本系统中是唯一的。
    • 命名管道可以被任意符合权限要求的进程访问。
    • 命名管道只能在本地创建。
    • 命名管道是双向的,所以两个进程可以通过同一管道进行交互。
    • 多个独立的管道实例可以用一个名称来命名。 例如几个客户端可以使用名称相同的管道与同一个服务器进行并发通信。

    客户端代码 

    1. #include
    2. #include
    3. #include
    4. #include "windows.h"
    5. #include "stdio.h"
    6. using namespace std;
    7. #define PIPE_NAME L"\\\\.\\Pipe\\test"
    8. void main()
    9. {
    10. char buffer[1024];
    11. DWORD WriteNum;
    12. if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) == FALSE)
    13. {
    14. cout << "等待命名管道实例失败!" << endl;
    15. return;
    16. }
    17. HANDLE hPipe = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    18. if (hPipe == INVALID_HANDLE_VALUE)
    19. {
    20. cout << "创建命名管道失败!" << endl;
    21. CloseHandle(hPipe);
    22. return;
    23. }
    24. cout << "与服务器连接成功!" << endl;
    25. //std::istringstream input);
    26. string str;
    27. while (1)
    28. {
    29. getline(cin, str);//等待数据输入
    30. if (WriteFile(hPipe, str.c_str(), strlen(str.c_str()), &WriteNum, NULL) == FALSE)
    31. {
    32. cout << "数据写入管道失败!" << endl;
    33. break;
    34. }
    35. }
    36. cout << "关闭管道!" << endl;
    37. CloseHandle(hPipe);
    38. system("pause");
    39. }

    服务器端代码

    1. #include "iostream"
    2. #include "windows.h"
    3. using namespace std;
    4. #define PIPE_NAME L"\\\\.\\Pipe\\test"
    5. void main()
    6. {
    7. char buffer[1024];
    8. DWORD ReadNum;
    9. HANDLE hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL);
    10. if (hPipe == INVALID_HANDLE_VALUE)
    11. {
    12. cout << "创建命名管道失败!" << endl;
    13. CloseHandle(hPipe);
    14. return;
    15. }
    16. if (ConnectNamedPipe(hPipe, NULL) == FALSE)
    17. {
    18. cout << "与客户机连接失败!" << endl;
    19. CloseHandle(hPipe);
    20. return;
    21. }
    22. cout << "与客户机连接成功!" << endl;
    23. while (1)
    24. {
    25. if (ReadFile(hPipe, buffer, 1024, &ReadNum, NULL) == FALSE)
    26. {
    27. cout << "读取数据失败!" << endl;
    28. break;
    29. }
    30. buffer[ReadNum] = 0;
    31. cout << "读取数据:" << buffer << endl;
    32. }
    33. cout << "关闭管道!" << endl;
    34. CloseHandle(hPipe);
    35. system("pause");
    36. }

  • 相关阅读:
    制造业单项冠军(国家级、广东省、深圳市)奖励政策及申报对比
    vue 点击当前元素进行显示隐藏,上次点过的元素隐藏
    基于Matlab求解高教社杯数学建模竞赛(cumcm2010A题)-储油罐的变位识别与罐容表标定(附上源码+数据+题目)
    9月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!
    【Vite】development、mock和production不同环境下的配置
    Windows上部署Discuz论坛
    6-1 CCat类的静态数据【武汉理工大学】
    【LeetCode】42. 接雨水 - Go 语言题解
    肖sir__项目讲解流程___(自我介绍、项目流程)
    javascript为什么叫脚本语言
  • 原文地址:https://blog.csdn.net/lmy347771232/article/details/133779702