C++ 使用 Windows 命名管道

2024-05-18

由于某种原因,桅杆和从属装置都失败了,但是我可以找到任何关于它们如何工作的好例子,所以我不确定我哪里出了问题。

在 ConnectNamedPipe 之后,主设备永远不会退出 WaitForSingleObject,并且从设备在第一个 boost::asio::read 调用中抛出异常,“等待进程打开管道的另一端”,我认为 WaitNamedPipe 的目的是与master中的ConnectNamedPipe一起等待吗?

大师.cpp

asio::io_service ioservice; 
asio::windows::stream_handle in(ioservice); 
int main()
{
    HANDLE pipe = INVALID_HANDLE_VALUE;
    try
    {
        //create pipe
        pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",
            PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED,
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
            255, 50000,50000, 0, 0);
        if(pipe == INVALID_HANDLE_VALUE)
        {
            printWinError();
            return -1;
        }
        in.assign(pipe); 
        std::cout << "Created pipe" << std::endl;
        //spawn child
        STARTUPINFO         startInfo;
        ZeroMemory(&startInfo, sizeof(STARTUPINFO));
        startInfo.cb = sizeof(STARTUPINFO);
        PROCESS_INFORMATION procInfo;
        ZeroMemory(&procInfo, sizeof(PROCESS_INFORMATION));
        if(CreateProcess(0, "slave.exe", 0,0, FALSE, CREATE_NEW_CONSOLE,
            0, 0, &startInfo, &procInfo))
        {
            std::cout << "Slave process created" << std::endl;
        }
        else
        {
            printWinError();
            DisconnectNamedPipe(pipe);
            return -1;
        }

        OVERLAPPED overlapped = {0};
        overlapped.hEvent = CreateEvent(0,TRUE,FALSE,0);
        if(ConnectNamedPipe(pipe, &overlapped) == FALSE)
        {
            unsigned error = GetLastError();
            if(error != ERROR_PIPE_CONNECTED &&
                error != ERROR_IO_PENDING)
            {
                printWinError();
                DisconnectNamedPipe(pipe);
                return -1;
            }
        }
        WaitForSingleObject(overlapped.hEvent, INFINITE);
        CloseHandle(overlapped.hEvent);
        std::cout << "Pipe connected" << std::endl;

        for(int i = 0; i < 100; ++i)
        {
            boost::system::error_code error;
            unsigned n = i * 5;
            asio::write(in,asio::buffer((char*)&n, sizeof(unsigned)),
                asio::transfer_all(), error);
            if(error)throw boost::system::system_error(error);
        }
        std::cout << "Sent data" << std::endl;

        FlushFileBuffers(pipe);
        DisconnectNamedPipe(pipe);
        system("pause");
        return 0;
    }
    catch(const std::exception &e)
    {
        std::cout << e.what() << std::endl;
        if(pipe != INVALID_HANDLE_VALUE)
            DisconnectNamedPipe(pipe);
        system("pause");
        return -1;
    }
}

从机.cpp

asio::io_service ioservice; 
asio::windows::stream_handle in(ioservice); 
int main()
{
    try
    {
        WaitNamedPipe("\\\\.\\pipe\\FLTest", NMPWAIT_WAIT_FOREVER);

        std::cout << "Pipe avaible" << std::endl;
        HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",
            PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
            255, 50000,50000,0,0);
        if(pipe == INVALID_HANDLE_VALUE)
        {
            printWinError();
            return -1;
        }

        in.assign(pipe); 
        std::cout << "Pipe connected" << std::endl;

        for(int i = 0; i < 100; ++i)
        {
            std::cout << "i: " << i << std::endl;
            boost::system::error_code error;
            unsigned n;
            asio::read(in,asio::buffer((char*)&n,sizeof(unsigned)),
                asio::transfer_all(), error);
            if(error)throw boost::system::system_error(error);
        }
        system("pause");
        return 0;
    }
    catch(const std::exception &e)
    {
        std::cout << e.what() << std::endl;
        system("pause");
        return -1;
    }
}

显然我得到了完全错误的东西,但是我在网上找不到任何东西可以与我的代码进行比较。


在您的从站中,您需要调用 CreateFile() 来打开管道,而不是 CreateNamedPipe。

   HANDLE pipe = CreateFile("\\\\.\\pipe\\FLTest",                 
      GENERIC_READ | GENERIC_WRITE,            
      0,                                          
      NULL,                                       
      OPEN_EXISTING,                              
      FILE_FLAG_OVERLAPPED,                     
      NULL
      );    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 使用 Windows 命名管道 的相关文章

随机推荐

  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 对 data.table 中的列表列执行操作

    假设我有一个data table 例如dt lt data table foo list 1 3 4 6 bar c 2 7 如何使用 dt 框架对 foo 向量列表执行操作 操作可能是将 bar 添加到 foo 返回列表 3 5 11 1
  • 在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?

    我想使用 xaml 中的 Visual Studio Designer 设计一个现代外观的 UI 它为我提供了一个很好的工具箱 我可以使用它通过拖放来直观地创建 UI 由于它几乎表现得像 HTML 我想知道它是否也有丰富的主题库 我找到了一
  • 阻止 ingress-nginx 负载均衡器上的特定路径

    我有许多指向入口控制器 IP 的域 我想阻止所有域 站点的 特定路径 有没有办法做到这一点 我可以用nginx ingress kubernetes io configuration snippet 对于每个站点 但正在寻找同时处理所有站点
  • Gradle 构建错误:内存不足

    当我使用 gradle 构建时 它失败并显示以下信息 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x0000000788800000 89128960 0 failed e
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • Django 选择性转储数据

    是否可以有选择地过滤哪些记录Django的dumpdata管理命令输出 我有几个模型 每个模型都有数百万行 我只想转储一个模型中符合特定条件的记录 以及引用任何这些记录的所有外键链接记录 考虑这个用例 假设我有一个生产数据库 其中我的用户模
  • 有没有办法使用 Vue-Router 从动态 URL 中删除目录?

    我为一家保险经纪公司构建了一个 vue js Web 应用程序 其中每个代理人都有自己的网站 该网站是根据他们的个人资料生成的 这就是我的 vue router 索引文件中的链接的样子 path agents id name AgentSi
  • 如何将 'IN (1,2,3)' 与 findAll 一起使用?

    我需要从数据库中获取几个学生 并且我将他们的主键放在以逗号分隔的字符串中 通常使用 SQL 会是这样的 cleanedStudentIdStringList 1 2 3 4 SELECT FROM Student WHERE id IN c
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 如何使用 Coffeescript 在 React 中渲染 HTML 标签?

    我目前正在学习 ReactJS 以及如何使用 Ruby on Rails 作为其后端 所以如果我做出愚蠢的假设 我深表歉意 请随意责骂我 我正在关注一个教程 其中作者使用 Coffeescript 而不是 ES6 来处理他的 ReactJS
  • 列出 grunt.js 任务

    我正在尝试弄清楚如何打印所有可用的 grunt 任务的列表 如果使用耙子 则为 rake T grunt 相当于什么 例如 grunt T concat jasmine minify grunt help列出可用的任务
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • server-conn 和 client-conn 通道是唯一可以拥有多个实例的通道吗?

    我无法找到获取其他频道类型的方法 例如发送者通道 可以是多个实例 没有任何记录反对这一点 我假设只有连接通道可以有多个实例 它是否正确 Thanks 可以具有多个实例的通道包括客户端使用的通道 MQI 通道 和 QMgrs 使用的通道 MC
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • Helm 3 图表安装错误:验证数据时出错:未设置 apiVersion

    我有一个简单的 helm 图表 它将通过 docker 桌面将应用程序部署到我的 kubernetes 本地副本 如果我使用 kubectl 一次部署一个 yaml 文件 一切都会正常工作 但是 当我尝试创建 helm 图表以方便部署时 出
  • Fancybox - Ajax 图片库

    我有一个自定义图像库 它用缩略图填充 div 每个缩略图都包含在一个 fancybox 组中 当您单击一个 它在 fancybox 中打开 时 您可以按 上一张 下一张 在第一 页面 上的图像之间循环 要在页面之间移动 您必须关闭 fanc
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • HTML5

    我想在随机位置开始和停止 HTML5 播放 并具有淡入和淡出周期 以平滑聆听体验 为此存在什么样的机制 使用 setTimeout 手动增加音量 jQuery 的方式 audio animate volume newVolume 1000
  • C++ 使用 Windows 命名管道

    由于某种原因 桅杆和从属装置都失败了 但是我可以找到任何关于它们如何工作的好例子 所以我不确定我哪里出了问题 在 ConnectNamedPipe 之后 主设备永远不会退出 WaitForSingleObject 并且从设备在第一个 boo