2009-02-10 17 views
5

Devo determinare se un handle che il mio codice non ha creato, per il quale GetFileType()==FILE_TYPE_PIPE, è un socket o meno. Non sembra esserci un'API per questo.Come distinguere un handle di socket Win32 da altri handle di pipe?

Ho provato quanto segue. L'idea generale è di utilizzare una funzione specifica del socket e trattare l'errore come non socket.

  • getsockopt() - Questo è stato il mio primo tentativo. Sfortunatamente sembra bloccarsi quando chiamato da molti thread sullo stesso handle (non-socket).
  • WSAEnumNetworkEvents() - questo è ciò che fa Gnulib ma avrà effetti collaterali indesiderati se l'handle è un socket.
  • getpeername() - questo è ciò che Cygwin fa, ma questo fallirà anche per alcune prese. Indovinare se un errore implica socket non sembra affidabile e sicuro per il futuro.

Non mi importa se la soluzione funziona solo su alcune versioni di Windows, ad es. Vista, posso sempre ricorrere ad un altro metodo nel caso generale.

risposta

1

Hai provato WSADuplicateSocket. Quindi controlla semplicemente WSAPROTOCOL_INFO per vedere se si tratta di una pipe con nome ...

+0

No. Ci proverò, grazie. –

2

Sto pensando che forse potresti provare a chiamare GetNamedPipeInfo() sul tuo manico. Se la chiamata ha esito positivo, sai che l'handle è un handle di pipe, altrimenti deve essere un socket.

+0

Grazie. Questo potrebbe essere più sicuro dell'utilizzo delle funzioni specifiche del socket (che sono note per essere bloccate per non socket). –

0

È possibile utilizzare anche GetNamedPipeHandleState(), valutando il risultato con GetLastError().