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

試しましたかWSADuplicateSocket。次にWSAPROTOCOL_INFO、それが実際に名前付きパイプであるかどうかを確認します...

于 2009-02-11T22:40:33.430 に答える
0

GetNamedPipeHandleState() を使用して、結果を GetLastError() で評価することもできます。

于 2015-02-20T11:58:09.563 に答える