如何区分Win32插槽手柄与其他管道手柄?

Per*_*ner 5 winapi winsock

我需要确定我的代码没有创建的句柄GetFileType()==FILE_TYPE_PIPE,是否为套接字.似乎没有这方面的API.

我尝试了以下内容.一般的想法是使用特定于套接字的函数并将失败视为非套接字.

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

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

Mat*_*son 1

你有没有尝试过WSADuplicateSocket。然后检查一下WSAPROTOCOL_INFO它是否实际上是一个命名管道......