【问题标题】:How to distinguish a Win32 socket handle from other pipe handles?如何区分 Win32 套接字句柄和其他管道句柄?
【发布时间】:2009-02-10 11:11:26
【问题描述】:

我需要确定我的代码未创建的句柄(GetFileType()==FILE_TYPE_PIPE)是否是套接字。似乎没有用于此的 API。

我尝试了以下方法。总体思路是使用特定于套接字的函数,并将失败视为非套接字。

  • getsockopt() -- 这是我的第一次尝试。不幸的是,当被同一个(非套接字)句柄上的多个线程调用时,它似乎挂起。
  • WSAEnumNetworkEvents() -- 这是 Gnulib 所做的,但如果句柄 套接字,则会产生不良副作用。
  • getpeername() -- 这是 cygwin 所做的,但对于某些套接字也会失败。猜测错误是否意味着套接字性似乎并不可靠且未来安全。

我不介意该解决方案是否仅适用于某些版本的 Windows,例如Vista,在一般情况下,我总是可以使用其他方法。

【问题讨论】:

    标签: winapi winsock


    【解决方案1】:

    我想也许您可以尝试在您的句柄上调用 GetNamedPipeInfo()。如果调用成功就知道句柄是管道句柄,否则一定是套接字。

    【讨论】:

    • 谢谢。这可能比使用特定于套接字的函数(已知会为非套接字挂起)更安全。
    【解决方案2】:

    你试过WSADuplicateSocket。然后只需检查WSAPROTOCOL_INFO 看看它是否实际上是一个命名管道......

    【讨论】:

      【解决方案3】:

      您也可以使用 GetNamedPipeHandleState(),使用 GetLastError() 评估结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-19
        • 2010-10-09
        • 2010-09-05
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多