代码之家  ›  专栏  ›  技术社区  ›  Ronen Ness Han

ace pipe open有时返回错误10060-“连接尝试失败,因为连接方没有正确响应”

  •  0
  • Ronen Ness Han  · 技术社区  · 7 年前

    以下呼叫:

    ACE_HANDLE handles[2];
    ACE_Pipe pipe;
    if (pipe.open(handles)==-1)
        T_OS_ELOG(ACE_OS::last_error());
    

    有时会导致错误,ace_os::last_error返回以下字符串:

    Error code: 10060. Error details: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 
    

    我觉得很混乱,因为错误字符串和所有相关的文档/答案都提到远程方/对等方没有响应,但在我的例子中,我只是试图打开一个管道,还没有真正的对等方。

    这不是一个与防火墙相关的问题(现在还没有防火墙,也没有任何东西进入外部),我很确定这不是因为我没有端口或类似的东西,因为在这种情况下,我得到了 "Only one usage of each socket address (protocol/network address/port) is normally permitted" .

    那么是什么导致了这个错误呢?

    (我在Windows BTW上运行)

    2 回复  |  直到 7 年前
        1
  •  2
  •   Steve Huston    7 年前

    我不知道错误的根本原因是什么,但在windows上,ace_管道是使用环回tcp套接字实现的。这就是远程对等/聚会的概念是如何进入画面的。我建议使用调试器单步执行它,并查看哪些调用失败。

        2
  •  0
  •   Ronen Ness Han    7 年前

    为未来的搜索者回答我自己:正如steve huston提到的,ace_pipe是在windows上使用tcp环回套接字实现的。

    TCP环回在窗口的调度程序中优先级很低,因此当系统太忙时,如果有太多的高优先级任务等待,打开环回连接可能会随机超时。

    一个可选的解决方案是使用快速路径套接字( https://blogs.technet.microsoft.com/wincat/2012/12/05/fast-tcp-loopback-performance-and-low-latency-with-windows-server-2012-tcp-loopback-fast-path/ )或者完全删除套接字并改用匿名管道( https://docs.microsoft.com/en-us/windows/desktop/ipc/anonymous-pipes )

    不幸的是,这两个选项都不受ace支持,因此这需要实现自己的ipc,而不是使用ace_pipe。也不是跨平台的。