📄 enumerate.cpp
字号:
#include <winsock2.h>
#include <windows.h>
#include <objbase.h>
#include <stdio.h>
#ifndef _WIN32_WINNT
#define _WIN32_WINNT
#endif
#include "af_irda.h"
#include "wsrm.h"
#include "ws2atm.h"
#include <wsipx.h>
#include <atalkwsh.h>
BOOL EnumerateProtocols(WSAPROTOCOL_INFO **wsapi,DWORD *dwCount);
void PrintProtocolInfo(WSAPROTOCOL_INFO *wsapi);
int __cdecl main(int argch,char **argv)
{
WSAPROTOCOL_INFO *wsapi=NULL;
WSADATA wsd;
DWORD dwCount,
i;
//初始化WS2_32.LIB
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("Unable to load Winsock2 DLL!\n");
return 1;
}
//列举所有协议
if(EnumerateProtocols(&wsapi,&dwCount)==FALSE)
{
printf("Failed to enumerate protocols\n");
return 1;
}
//列印出所协议
printf("Num protocols found:%ld\n",dwCount);
for(i=0;i<dwCount;i++)
{
PrintProtocolInfo(&wsapi[i]);
}
//终止
WSACleanup();
return 0;
}
//取所有通讯协议
BOOL EnumerateProtocols(WSAPROTOCOL_INFO **wsapi,DWORD *dwCount)
{
DWORD dwErr,
dwRet,
dwBufLen=0;
*dwCount=0;
*wsapi=NULL;
if(SOCKET_ERROR!=WSAEnumProtocols(NULL,*wsapi,&dwBufLen)) //列举所有协议
{
printf("WSAEnumProtocols failed!\n");
return FALSE;
}else if(WSAENOBUFS!=(dwErr=WSAGetLastError()))
{
printf("WSAEnumProtocols failed:%d\n",dwErr);
return FALSE;
}
*wsapi = (WSAPROTOCOL_INFO *)GlobalAlloc(GMEM_FIXED,dwBufLen); //分配存储空间
if(*wsapi==NULL)
{
printf("GlobalAlloc failed:%d\n",GetLastError());
return FALSE;
}
dwRet=WSAEnumProtocols(NULL,*wsapi,&dwBufLen); //列举所有协议
if(dwRet==SOCKET_ERROR)
{
printf("WSAEnumProtocols failed:%d\n",WSAGetLastError());
GlobalFree(*wsapi); //释放空间
return FALSE;
}
*dwCount = dwRet;
return TRUE;
}
//列印协议信息
void PrintProtocolInfo(WSAPROTOCOL_INFO *wsapi)
{
WCHAR szGuidString[256];
int i;
printf("\nProtocol:%s\n",wsapi->szProtocol);
printf(" Address Family:");
switch(wsapi->iAddressFamily)
{
case AF_INET:
case AF_INET6:
printf("%s\n",(wsapi->iAddressFamily==AF_INET?"AF_INET":"AF_INET6"));
switch(wsapi->iProtocol)
{
case IPPROTO_IP:
printf("IPPROTO_IP\n");
break;
case IPPROTO_ICMP:
printf("IPPROTO_ICMP\n");
break;
case IPPROTO_IGMP:
printf("IPPROTO_IGMP\n");
break;
case IPPROTO_GGP:
printf("IPPROTO_GGP\n");
break;
case IPPROTO_TCP:
printf("IPPROTO_TCP\n");
break;
case IPPROTO_PUP:
printf("IPPROTO_PUP\n");
break;
case IPPROTO_UDP:
printf("IPPROTO_UDP\n");
break;
case IPPROTO_IDP:
printf("IPPROTO_IDP\n");
break;
case IPPROTO_ND:
printf("IPPROTO_ND\n");
break;
case IPPROTO_RM:
printf("IPPROTO_RM\n");
break;
case IPPROTO_RAW:
printf("IPPROTO_RAW\n");
break;
}
break;
case AF_UNSPEC:
printf("AF_UNSPEC\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_UNIX:
printf("AF_UNIX\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_IMPLINK:
printf("AF_IMPLINK\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_PUP:
printf("AF_PUP\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_CHAOS:
printf("AF_CHAOS\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_NS:
printf("AF_NS\n");
printf(" Protocol:UNKNOWN:");
switch(wsapi->iProtocol)
{
case NSPROTO_IPX:
printf("NSPROTO_IPX\n");
break;
case NSPROTO_SPX:
printf("NSPROTO_SPX\n");
break;
case NSPROTO_SPXII:
printf("NSPROTO_SPXII\n");
break;
}
break;
case AF_ISO:
printf("AF_ISO or AF_OSI\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_ECMA:
printf("AF_ECMA\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_DATAKIT:
printf("AF_DATAKIT\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_CCITT:
printf("AF_CCITT\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_SNA:
printf("AF_SNA\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_DECnet:
printf("AF_DECnet\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_DLI:
printf("AF_DLI\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_LAT:
printf("AF_LAT\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_HYLINK:
printf("AF_HYLINK\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_APPLETALK:
printf("AF_APPLETALK\n");
printf(" Protocol:");
switch(wsapi->iProtocol)
{
case DDPPROTO_RTMP:
printf("DDPPROTO_TRMP\n");
break;
case DDPPROTO_NBP:
printf("DDPPROTO_NBP\n");
break;
case DDPPROTO_ATP:
printf("DDPPROTO_ATP\n");
break;
case DDPPROTO_AEP:
printf("DDPPROTO_AEP\n");
break;
case DDPPROTO_RTMPRQ:
printf("DDPPROTO_RTMPRQ\n");
break;
case DDPPROTO_ZIP:
printf("DDPPROTO_ZIP\n");
break;
case DDPPROTO_ADSP:
printf("DDPPROTO_ADSP\n");
break;
case ATPROTO_ADSP:
printf("ATPROTO_ADSP\n");
break;
case ATPROTO_ATP:
printf("ATPROTO_ATP\n");
break;
case ATPROTO_ASP:
printf("ATPROTO_ASP\n");
break;
case ATPROTO_PAP:
printf("ATPROTO_PAP\n");
break;
}
break;
case AF_NETBIOS:
printf("AF_NETBIOS\n");
printf(" Protocol:");
printf("NetBIOS LANA %d\n",((wsapi->iProtocol==0x80000000)?0:abs(wsapi->iProtocol)));
break;
case AF_VOICEVIEW:
printf("AF_VOICEVIEW\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_FIREFOX:
printf("AF_FIREFOX\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_UNKNOWN1:
printf("AF_UNKNOWN1\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_BAN:
printf("AF_BAN\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_ATM:
printf("AF_ATM\n");
printf(" Protocol:");
switch(wsapi->iProtocol)
{
case ATMPROTO_AALUSER:
printf("ATMPROTO_AALUSER\n");
break;
case ATMPROTO_AAL1:
printf("ATMPROTO_AAL1\n");
break;
case ATMPROTO_AAL2:
printf("ATMPROTO_AAL2\n");
break;
case ATMPROTO_AAL34:
printf("ATMPROTO_AAL34\n");
break;
case ATMPROTO_AAL5:
printf("ATMPROTO_AAL5\n");
break;
}
break;
case AF_CLUSTER:
printf("AF_CLUSTER\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_12844:
printf("AF_12844\n");
printf(" Protocol:UNKNOWN:%d",wsapi->iProtocol);
break;
case AF_IRDA:
printf("AF_IRDA\n");
printf(" Protocol:");
switch(wsapi->iProtocol)
{
case IRDA_PROTO_SOCK_STREAM:
printf("IRDA_PROTO_SOCK_STREAM\n");
break;
}
break;
default:
printf("UNKNOWN:%d\n",wsapi->iAddressFamily);
}
printf(" Socket Type:");
switch(wsapi->iSocketType)
{
case SOCK_STREAM:
printf("SOCK_STREAM\n");
break;
case SOCK_DGRAM:
printf("SOCK_DGRAM\n");
break;
case SOCK_RAW:
printf("SOCK_RAW\n");
break;
case SOCK_RDM:
printf("SOCK_RDM\n");
break;
case SOCK_SEQPACKET:
printf("SOCK_SEQPACKET\n");
break;
}
printf(" Connectionness:");
if(wsapi->dwServiceFlags1 & XP1_CONNECTIONLESS)
printf("YES\n");
else
printf("NO\n");
printf(" Guaranteed Delivery:");
if(wsapi->dwServiceFlags1 & XP1_GUARANTEED_DELIVERY)
printf("YES\n");
else
printf("NO\n");
printf(" Guaranteed Order:");
if(wsapi->dwServiceFlags1 & XP1_GUARANTEED_ORDER)
printf("YES\n");
else
printf("NO\n");
printf(" Message Oriented:");
if(wsapi->dwServiceFlags1 & XP1_MESSAGE_ORIENTED)
printf("YES\n");
else
printf("NO\n");
printf(" Pseudo Stream:");
if(wsapi->dwServiceFlags1 & XP1_PSEUDO_STREAM)
printf("YES\n");
else
printf("NO\n");
printf(" Graceful Close:");
if(wsapi->dwServiceFlags1 & XP1_GRACEFUL_CLOSE)
printf("YES\n");
else
printf("NO\n");
printf(" Expedited Data:");
if(wsapi->dwServiceFlags1 & XP1_EXPEDITED_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Connect Data:");
if(wsapi->dwServiceFlags1 & XP1_CONNECT_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Connect Data:");
if(wsapi->dwServiceFlags1 & XP1_CONNECT_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Disconnect Data:");
if(wsapi->dwServiceFlags1 & XP1_DISCONNECT_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Supports Broadcast:");
if(wsapi->dwServiceFlags1 & XP1_SUPPORT_BROADCAST)
printf("YES\n");
else
printf("NO\n");
printf(" Supports Multipoint:");
if(wsapi->dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT)
printf("YES\n");
else
printf("NO\n");
printf(" Multipoint Control Plane:");
if(wsapi->dwServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE)
printf("ROOTED\n");
else
printf("NON-ROOTED\n");
printf(" Multipoint Data Plane:");
if(wsapi->dwServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE)
printf("YES\n");
else
printf("NO\n");
printf(" Multipoint Control Plane:");
if(wsapi->dwServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE)
printf("YES\n");
else
printf("NO\n");
printf(" QoS Supported:");
if(wsapi->dwServiceFlags1 & XP1_QOS_SUPPORTED)
printf("YES\n");
else
printf("NO\n");
printf(" Unidirectional Sends:");
if(wsapi->dwServiceFlags1 & XP1_UNI_SEND)
printf("YES\n");
else
printf("NO\n");
printf(" Unidirection Receives:");
if(wsapi->dwServiceFlags1 & XP1_UNI_RECV)
printf("YES\n");
else
printf("NO\n");
printf(" IFS Handles:");
if(wsapi->dwServiceFlags1 & XP1_IFS_HANDLES)
printf("YES\n");
else
printf("NO\n");
printf(" Partial Messages:");
if(wsapi->dwServiceFlags1 & XP1_PARTIAL_MESSAGE)
printf("YES\n");
else
printf("NO\n");
printf(" Provider Flags:");
switch(wsapi->dwProviderFlags)
{
case PFL_MULTIPLE_PROTO_ENTRIES:
printf("This is one or more entries for a protocol\n");
printf("\t\t\t which is capable of implementing multiple\n");
printf("\t\t\t behaviors\n");
break;
case PFL_RECOMMENDED_PROTO_ENTRY:
printf("This entry is recommended for a protocol\n");
printf("\t\t\t that is capable of multple behaviors\n");
break;
case PFL_HIDDEN:
printf("\n");
printf("You shouldn't be seeing this\n");
break;
case PFL_MATCHES_PROTOCOL_ZERO:
printf("A value of zero in the protocol parameter\n");
printf("\t\t\t of socket or WSASocket matches this entry\n");
break;
default:
printf("NONE\n");
}
StringFromGUID2(wsapi->ProviderId, szGuidString, 256);
printf(" Provider Id: %S\n", szGuidString);
printf(" Catalog Entry Id: %ld\n", wsapi->dwCatalogEntryId);
printf(" Number of Chain Entries: %d {",
wsapi->ProtocolChain.ChainLen);
for(i=0; i < wsapi->ProtocolChain.ChainLen ;i++)
printf("%ld ", wsapi->ProtocolChain.ChainEntries[i]);
printf("}\n");
printf(" Version: %d\n", wsapi->iVersion);
printf("Max Socket Address Length: %d\n", wsapi->iMaxSockAddr);
printf("Min Socket Address Length: %d\n", wsapi->iMinSockAddr);
printf(" Protocol Max Offset: %d\n", wsapi->iProtocolMaxOffset);
printf(" Network Byte Order: ");
if (wsapi->iNetworkByteOrder == 0)
printf("BIG-ENDIAN\n");
else
printf("LITLE-ENDIAN\n");
printf(" Security Scheme: ");
if (wsapi->iSecurityScheme == SECURITY_PROTOCOL_NONE)
printf("NONE\n");
else
printf("%d\n", wsapi->iSecurityScheme);
printf(" Message Size: ");
if (wsapi->dwMessageSize == 0)
printf("N/A (Stream Oriented)\n");
else if (wsapi->dwMessageSize == 1)
printf("Depended on underlying MTU\n");
else if (wsapi->dwMessageSize == 0xFFFFFFFF)
printf("No limit\n");
else
printf("%ld\n", wsapi->dwMessageSize);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -