5

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

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

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

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

4

3 回答 3

2

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

于 2009-05-30T12:30:55.917 回答
1

Have you tried WSADuplicateSocket. Then just check WSAPROTOCOL_INFO to see if it is in fact a named pipe...

于 2009-02-11T22:40:33.430 回答
0

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

于 2015-02-20T11:58:09.563 回答