2009-02-10 4 views
5

Necesito determinar si un identificador que mi código no creó, para el cual GetFileType()==FILE_TYPE_PIPE, es un socket o no. No parece haber una API para esto.¿Cómo distinguir un asa de socket Win32 de otros mangos de tubería?

He intentado lo siguiente. La idea general es utilizar una función específica del socket y tratar la falla como sin socket.

  • getsockopt() - Este fue mi primer intento. Desafortunadamente, parece colgarse cuando se lo llama por muchos hilos en el mismo manejador (sin zócalo).
  • WSAEnumNetworkEvents() - esto es lo que hace Gnulib, pero tendrá efectos secundarios indeseables si el asa es una toma.
  • getpeername() - esto es lo que hace cygwin, pero esto también fallará en algunos enchufes. Adivinar si un error implica socket-ness no parece confiable y futuro seguro.

No me importa si la solución solo funciona en algunas versiones de Windows, p. Vista, siempre puedo recurrir a algún otro método en el caso general.

Respuesta

1

¿Has probado WSADuplicateSocket. Luego solo marque WSAPROTOCOL_INFO para ver si de hecho es una tubería con nombre ...

+0

No. Lo intentaré, gracias. –

2

Estoy pensando que quizás podría intentar llamar al GetNamedPipeInfo() en su mango. Si la llamada tiene éxito, usted sabe que el mango es un mango de tubo, de lo contrario debe ser un enchufe.

+0

Gracias. Esto podría ser más seguro que usar las funciones específicas del socket (que se sabe cuelgan para no sockets). –

0

También puede usar GetNamedPipeHandleState(), evaluando el resultado con GetLastError().

Cuestiones relacionadas