私のコードが作成しなかったハンドルがGetFileType()==FILE_TYPE_PIPE
ソケットであるかどうかを判断する必要があります。このための API はないようです。
私は以下を試しました。一般的な考え方は、ソケット固有の関数を使用し、失敗を非ソケットを意味するものとして扱うことです。
getsockopt()
-- 初めての試みでした。残念ながら、同じ (非ソケット) ハンドルで多くのスレッドから呼び出されるとハングするようです。WSAEnumNetworkEvents()
-- これは Gnulib が行うことですが、ハンドルがソケットの場合、望ましくない副作用があります。getpeername()
-- これは cygwin が行うことですが、一部のソケットでも失敗します。エラーがソケット性を意味するかどうかを推測することは、信頼できず、将来的に安全ではないようです。
ソリューションが Windows の一部のバージョン (Vista など) でのみ機能するかどうかは気にしません。一般的なケースでは、いつでも他の方法にフォールバックできます。