Мне нужно определить, является ли дескриптор, который не был создан моим кодом, для которого GetFileType()==FILE_TYPE_PIPE
, сокетом или нет. Похоже, для этого нет API.
Я пробовал следующее. Общая идея состоит в том, чтобы использовать функцию, специфичную для сокета, и рассматривать сбой как означающий не сокет.
getsockopt()
- Это была моя первая попытка. К сожалению, он, кажется, зависает, когда вызывается многими потоками на одной и той же (не сокетной) ручке.
WSAEnumNetworkEvents()
- это то, что делает Gnulib, но у него будут нежелательные побочные эффекты, если ручка является сокетом.
getpeername()
- это то, что делает Cygwin, но это не удастся и для некоторых сокетов. Гадание, подразумевает ли ошибка сокетность, не кажется надежным и безопасным в будущем.
Я не против, если решение работает только на некоторых версиях Windows, например Vista, я всегда могу прибегнуть к другому методу в общем случае.