Гм, вот корректный вариант.
SOCKET ifs_socket(int af, int type, int protocol)
{
unsigned long proto_buffers_len = 4096;
SOCKET out = INVALID_SOCKET;
int nProtocols[] = {protocol, 0};
WSAPROTOCOL_INFO *pInfo = NULL;
while ((pInfo = (WSAPROTOCOL_INFO *)realloc(pInfo, proto_buffers_len)))
{
int nResult = ::WSAEnumProtocols(nProtocols, pInfo, &proto_buffers_len);
if (nResult != SOCKET_ERROR)
{
for (int i = 0; i < nResult; ++i)
if (
((af == AF_UNSPEC) || (af == pInfo[i].iAddressFamily)) &&
(type == pInfo[i].iSocketType) &&
(pInfo[i].dwServiceFlags1 & XP1_IFS_HANDLES)
)
{
out = ::WSASocket(af, type, protocol, &pInfo[i], 0, 0);
break;
}
break;
}
if (::WSAGetLastError() != WSAENOBUFS)
break;
}
free(pInfo);
return out;
}