如何使用命名管道从 C++ 调用 WCF 方法?

2024-02-06

更新: 查看协议here http://msdn.microsoft.com/en-us/library/cc219293%28v=PROT.10%29.aspx,我不知道 Unsized Envelope Record 中会包含什么内容。我在网上找不到任何例子。

原来的:

我有以下 WCF 服务

    static void Main(string[] args)
    {
        var inst = new PlusFiver();
        using (ServiceHost host = new ServiceHost(inst,
            new Uri[] { new Uri("net.pipe://localhost") }))
        {
            host.AddServiceEndpoint(typeof(IPlusFive), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "PipePlusFive");
            host.Open();
            Console.WriteLine("Service is Available. Press enter to exit.");
            Console.ReadLine();
            host.Close();
        }
    }

   [ServiceContract]
   public interface IPlusFive
   {
       [OperationContract]
       int PlusFive(int value);
   }


   [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
   public class PlusFiver : IPlusFive
   {
      public int PlusFive(int value)
      {
          Console.WriteLine("Adding 5 to " + value);
          return value + 5;
      }      
   }

我输出添加 5 行,这样我就知道服务器是否处理了 请求与否。

我有一个 .NET 客户端,我用它来测试它,一切正常 预期的。

现在我想为此创建一个非托管 C++ 客户端。

我想出了如何获取管道的名称并写入它。
我已经从以下位置下载了协议here http://msdn.microsoft.com/en-us/library/cc219293%28v=PROT.10%29.aspx

我可以写入管道,但无法读取它。每当我尝试从中阅读时,我都会得到一个ERROR_BROKEN_PIPE 109 (0x6D) The pipe has been ended.错误。如果我用写入替换读取,写入就会成功,所以我不认为管道已关闭,至少在我尝试读取之前不会关闭。

这是我连接到管道的方式。

HANDLE OpenPipe(OLECHAR* bstrGuid)
{
    wstring pipeName = L"\\\\.\\pipe\\";
    wstring strGuid = bstrGuid;
    pipeName.append(strGuid.substr(1,36));
    wcout << "Pipe Name " << endl;
    wcout << pipeName.c_str() << endl;

    HANDLE hPipe = CreateFile(pipeName.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
    if(hPipe == INVALID_HANDLE_VALUE)
    {
        wcout << "failed to create pipe" << endl;
        system("pause");
        return NULL;
    }
    return hPipe;
}

这就是我创建要发送的第一条消息的方式

std::list<wchar_t> GetFirstMessage()
{
    std::list<wchar_t> message;
    message.push_back(0x00);// version record
    message.push_back(0x01);// major version
    message.push_back(0x00);// minor version
    message.push_back(0x01);// mode record
    message.push_back(0x01);// singleton-unsized mode
    message.push_back(0x02);// via record

    wstring url = L"net.pipe://localhost/PipePlusFive";
    message.push_back(url.length());// via length
    for(int x= 0;x<url.length();x++)
    {
        message.push_back(url[x]); // via
    }
    message.push_back(0x03);
    message.push_back(0x08);
    return message;
}

这就是我将其写入文件的方式。

int WriteMessage(HANDLE hPipe, LPVOID message, int size)
{
    DWORD bytesWritten;

    BOOL bWrite = WriteFile(hPipe, &message, size, &bytesWritten, NULL);
    wcout << "Bytes Written: " << bytesWritten << endl;
    if(bWrite == false)
    {
        wcout << "fail"<<endl;
        CloseHandle(hPipe);
        system("pause");
        return 1;
    }
    return 0;
}

    list<wchar_t> full_message = GetFirstMessage();
int result = WriteMessage(hPipe, &full_message, full_message.size());   
if (result == 1)
{ return 1;}

这是我写结束语的方式

    wchar_t message = 12;
result = WriteMessage(hPipe, &message, 1);
if (result == 1)
{ return 1;}

这是我尝试阅读回复的方式

    char buffer[10];
DWORD bytesRead;
BOOL bRead = ReadFile(hPipe, buffer, 1, &bytesRead, NULL);
if(bRead == false)
{
    wcout << "fail read"<<endl;
    wcout << "error: " << GetLastError() << endl;
    CloseHandle(hPipe);
    system("pause");
    return 1;
}

我是 C++ 新手,所以我不知道我是否没有正确遵循协议,或者在我尝试执行此操作的方式中犯了一个愚蠢的错误?

更新: 问题是我正在将指针地址写入命名管道而不是列表的内容。我已经解决了这个问题,现在我可以读取前导码确认记录了。现在我必须弄清楚协议的下一部分需要发送什么。


检查这是否适合您

  1. 尝试打开命名管道。 (创建文件)
  2. 设置指定命名管道的读取模式和阻塞模式。 (设置命名管道句柄状态)
  3. 向管道服务器发送消息并接收其响应。 (写文件,读文件)
  4. 关闭管道。 (关闭句柄)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用命名管道从 C++ 调用 WCF 方法? 的相关文章

随机推荐

  • 基于 Web 的 API 可以告诉我某个号码是固定电话还是手机? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的应用程序向人们发送短信 但输入的手机号码有时是固定电话 这是用户错误或用户并不真正知道他们的联系号码
  • 用javascript替换图像

    我想用javascript替换gif文件 我找到了下面的方法 有什么办法可以将 javascript 标签放在 img 标签之前吗 img class myImg src compman gif width 107 height 98 在文
  • 在 Windows 7 中使用 .NET Windows 服务显示消息框

    我们有一个 Windows 服务 用于在用户在 Windows XP 上扫描访问卡后显示确认消息框 但一旦我们迁移到 Windows 7 该弹出功能就不再起作用 任何人都可以指导我完成或给我任何关于如何尽快修复此功能的想法吗 正如您所发现的
  • 循环浏览文件夹中的文件并复制/粘贴到主文件

    我的一个文件夹中有 3 个文件和一个主模板 我想要 循环浏览这些文件 然后将内容复制到主文件 每个整个文件都将粘贴到主文件中的新工作表中 新工作表的名称将与文件的名称相同 下面的代码不起作用并且缺少功能 2 和 3 Sub AllFiles
  • 如何让 Maven 使用我的 TestNG XML 文件?

    首先 我已经阅读了这里关于如何执行此操作的每一篇文章 我正在遵循信中的所有说明 包括 Maven 本身的说明 我已使用 TestNG 将 Eclipse Selenium 项目转换为 Maven 项目 我无法让 Maven 从 Test X
  • 如何配置 JAXB / Moxy 以针对 XML 中潜在丢失的数据抛出错误

    如果提供的数据无法解组为预期的数据类型 是否可以将 JAXB 配置为引发异常 我们有一个 Integer XmlElement 有时会得到像 1 1 这样的值作为输入 Jaxb Moxy 只是默默地忽略这些值并将它们设置为 null 我们通
  • ReactJS 函数没有获取最新状态

    我正在尝试 ReactJS 但在将其合并到我的表单中时遇到了困难 我正在 ReactJS 中构建一个自动建议表单 在我的onChangeQuery 我正在设置状态 然后调用 AJAX 函数以从服务器端代码中获取建议 但是 我注意到loadG
  • C# foreach 循环 - 顺序*稳定性*有保证吗?

    假设我有一个给定的集合 在不以任何方式更改集合的情况下 我使用 foreach 循环遍历其内容两次 除非有宇宙射线之类的东西 是否绝对保证两个循环中的顺序一致 或者 给定一个HashSet
  • 模板参数中的“typename =”是什么意思?

    我在 Effective Modern C 一书的第189页看到过这样的表达 template
  • 基于另一个单元格的 VBA 过滤器

    我是 VBA 初学者 试图根据单元格值过滤数据 经过一番谷歌搜索后 我编写了一段有效的代码 Sub FilterDepartment Sales Sheet6 Activate Sheet6 Cells Select Selection A
  • cocoapods pods 项目构建设置

    因此 每次我们运行 pod 更新时 pods 项目都会重新生成 我们在 pods 项目中手动设置的任何构建设置都会被重置 我想知道在 pod 更新生成 pod 项目后是否可以在 pods 项目中设置一些目标的构建设置 任何帮助表示赞赏 经过
  • Java:使用 HTTPBasic 身份验证获取 URL

    我正在做一些简单的 HTTP 身份验证并得到一个 java lang IllegalArgumentException Illegal character s in message header value Basic OGU0ZTc5OD
  • 使用 help 和 pydoc 列出不工作的 python 模块

    我试图找出我为 python 安装了哪些模块 from 这个线程 https stackoverflow com questions 739993 get a list of installed python modules 我试过了 gt
  • Spring Data Neo4j 存储库组合错误:找不到类型 YYYY 的属性 XXXX

    这应该是一个简单的问题 关于我可能从 Spring Data 文档中遗漏的内容 我正在尝试实现存储库扩展 如下所述 http docs spring io spring data data neo4j docs 3 0 2 RELEASE
  • 实体与模型与视图模型[重复]

    这个问题在这里已经有答案了 我只是花了一些时间阅读这些术语 我不太使用它们 因为我们没有任何 MVC 应用程序 我通常只说 模型 但我感觉这些术语根据上下文意味着不同的东西 Entity 这很简单 就是数据库中的一行 就数据库而言 实体是单
  • python:多行正则表达式

    我有一段文本 我必须从中解析用户名和哈希值 现在我正在使用两个正则表达式来完成它 我可以只用一个多行正则表达式来完成吗 usr bin env python import re test str Hello UserName Please
  • HttpRuntime 缓存和 HttpContext 缓存有什么区别?

    我知道有一个非常相似的问题here https stackoverflow com questions 863654 difference b w httpruntime cache vs httpcontext current cache
  • 如何修改继续时的 Step StepState

    我正在关注这个教程https www youtube com watch v izbkS2svuq4 https www youtube com watch v izbkS2svuq4 并简要提到将 StepState 修改为 StepSt
  • Silex 设置 cookie

    我正在使用 Silex Framework 并且我正在拼命尝试设置 cookie 文档中找不到任何信息 我几乎尝试了所有方法 有人可能有这方面的经验 并且可以提供一个小例子吗 Thanks 以下是我的一个网站的摘录 该网站设置了 cooki
  • 如何使用命名管道从 C++ 调用 WCF 方法?

    更新 查看协议here http msdn microsoft com en us library cc219293 28v PROT 10 29 aspx 我不知道 Unsized Envelope Record 中会包含什么内容 我在网