Как отличить дескриптор сокета Win32 от других дескрипторов трубы? - PullRequest
5 голосов
/ 10 февраля 2009

Мне нужно определить, является ли дескриптор, который не был создан моим кодом, для которого GetFileType()==FILE_TYPE_PIPE, сокетом или нет. Похоже, для этого нет API.

Я пробовал следующее. Общая идея состоит в том, чтобы использовать функцию, специфичную для сокета, и рассматривать сбой как означающий не сокет.

  • getsockopt() - Это была моя первая попытка. К сожалению, он, кажется, зависает, когда вызывается многими потоками на одной и той же (не сокетной) ручке.
  • WSAEnumNetworkEvents() - это то, что делает Gnulib, но у него будут нежелательные побочные эффекты, если ручка является сокетом.
  • getpeername() - это то, что делает Cygwin, но это не удастся и для некоторых сокетов. Гадание, подразумевает ли ошибка сокетность, не кажется надежным и безопасным в будущем.

Я не против, если решение работает только на некоторых версиях Windows, например Vista, я всегда могу прибегнуть к другому методу в общем случае.

Ответы [ 3 ]

2 голосов
/ 30 мая 2009

Я думаю, что, возможно, вы могли бы попытаться вызвать GetNamedPipeInfo () на вашем дескрипторе. Если вызов успешен, вы знаете, что дескриптор является дескриптором канала, в противном случае это должен быть сокет.

1 голос
/ 12 февраля 2009

Вы пробовали WSADuplicateSocket. Затем просто проверьте WSAPROTOCOL_INFO, чтобы увидеть, действительно ли это именованный канал ...

0 голосов
/ 20 февраля 2015

Вы также можете использовать GetNamedPipeHandleState (), оценивая результат с помощью GetLastError ().

...