分类: C/C++
2012-01-27 03:57:10
网络中的主机需要安装TCP/IP协议或其他协议才能进行通信,网络应用程序有时需要获取主机上与网络有关的信息,这些信息一般存放在数据文件中。与网络有关的信息主要包括以下4大类:
·主机信息:与主机有关的信息,函数名一般以gethostby开头,在程序中较多使用。
·网络信息:与网络有关的信息,函数名一般以getnetby开头,在程序中较少使用。
·协议信息:与网络协议有关的信息,函数名一般以getprotoby开头,在程序中较少使用。
·服务信息:与网络提供的服务有关的信息,函数名一般以getservby开头,在程序中较多使用。
以下为获取网络信息的程序,代码如下:
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #include #pragma comment(lib,"ws2_32") #include #include #pragma comment(lib,"IPhlpApi") int main() { WSADATA wsaData;int i; if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartup Failed,Error=【%d】\n",WSAGetLastError()); return 1; } else printf("加载成功\n"); printf("--------1)使用函数gethostname()获取主机名-------\n"); char buf_hostname[110]; if (gethostname(buf_hostname,sizeof(buf_hostname))==SOCKET_ERROR) printf("gethostname failed!Error=%d\n",WSAGetLastError()); else printf("本机的主机名:%s\n",buf_hostname); printf("--------2)使用函数gethostbyname()根据主机名获取主机信息(IP地址)----\n"); struct hostent *pHostinf1; pHostinf1=gethostbyname(buf_hostname); if (pHostinf1==NULL) printf("gethostbyname failed!Error=%d\n",WSAGetLastError()); else { printf("本机主机正式名:%s\n",pHostinf1->h_name); printf("本机主机别名:%s\n",pHostinf1->h_aliases); if(pHostinf1->h_addrtype==AF_INET) printf("本机地址类型为IPv4\n"); if(pHostinf1->h_addrtype==AF_INET6) printf("本机地址类型为IPv6\n"); printf("本机主机地址长度:%d字节\n",pHostinf1->h_length); struct sockaddr_in addr1; for (i=0;pHostinf1->h_addr_list[i]!=NULL;i++) { memcpy(&addr1.sin_addr.s_addr,pHostinf1->h_addr_list[i],pHostinf1->h_length); printf("本地IP地址:%s\n",inet_ntoa(addr1.sin_addr)); } } printf("----------3)使用函数gethostbyaddr根据主机地址获取主机信息-----\n"); struct sockaddr_in addr2; u_long ip=addr2.sin_addr.s_addr=inet_addr("192.168.16.1"); printf("本机IP地址:%s\n",inet_ntoa(addr2.sin_addr)); struct hostent *pHostinf2=gethostbyaddr((char*)&ip,sizeof(addr2),AF_INET); if (pHostinf2==NULL) printf("gethostbyaddr Failed,Error=%d\n",WSAGetLastError()); else { printf("本地主机别名:%s\n",pHostinf2->h_aliases); if (pHostinf2->h_addrtype==AF_INET) printf("本机地址类型为IPv4\n"); if (pHostinf2->h_addrtype==AF_INET6) printf("本机地址类型为IPv6\n"); printf("本地主机地址长度:%d字节\n",pHostinf2->h_length); } printf("---------4)使用函数getprotobyname根据协议名得到主机协议信息------\n"); char a[]="icmp"; struct protoent *pro=getprotobyname((char*)&a); if (pro==NULL) printf("getprotobyname Failed,Error=%d\n",WSAGetLastError()); else { printf("正式的协议名:%s\n",pro->p_name); printf("协议号:%d\n",pro->p_proto); for (i=0;pro->p_aliases[i]!=NULL;i++) printf("协议名的别名:%s\n",pro->p_aliases[i]); } printf("--------5)使用函数getprotobynumber根据协议号得到主机协议信息-------\n"); struct protoent *pro2=getprotobynumber(6); if (pro2==NULL) printf("getprotobynumber failed,Error=%d\n",WSAGetLastError()); else { printf("正式的协议名:%s\n",pro2->p_name); printf("协议号:%d\n",pro2->p_proto); for (i=0;pro2->p_aliases[i]!=NULL;i++) printf("协议名的别名:%s\n",pro2->p_aliases[i]); } printf("---------6)使用函数getservbyname根据服务名得到相关服务信息-------\n"); struct servent *SerPor1=getservbyname("cmd",NULL); if (SerPor1==NULL) printf("getservbyname() Failed,Error=%d\n",WSAGetLastError()); else { printf("正式的服务名:%s\n",SerPor1->s_name); printf("服务所用端口号:%d\n",(unsigned short)SerPor1->s_port); printf("连接服务时用到的协议名:%s\n",SerPor1->s_proto); for (i=0;SerPor1->s_aliases[i]!=NULL;i++) printf("其他可选服务名:%s\n",SerPor1->s_aliases[i]); } printf("----------7)使用函数getservbyport根据端口号得到相关服务信息--------\n"); struct servent *SerPor2=getservbyport(514,NULL); if (SerPor2==NULL) printf("getservbyport() failed,Error=%d\n",WSAGetLastError()); else { printf("正式的服务名:%s\n",SerPor2->s_name); printf("服务所用端口号:%d\n",SerPor2->s_port); printf("连接服务时用到的协议名:%s\n",SerPor2->s_proto); for (i=0;SerPor2->s_aliases[i]!=NULL;i++) printf("其他可选服务名:%s\n",SerPor2->s_aliases[i]); } printf("-----------8)IP、子网掩码、网关、MAC地址---------\n"); u_long IP; //IP u_long sMask; //子网掩码 u_long Gateway; //网关 u_char Mac[6]; //MAC PIP_ADAPTER_INFO Info=NULL; ULONG Lbuf; in_addr in; GetAdaptersInfo(Info,&Lbuf); Info=(PIP_ADAPTER_INFO)malloc(Lbuf); if (GetAdaptersInfo(Info,&Lbuf)==ERROR_SUCCESS) { while (Info) { memcpy(Mac,Info->Address,6); Gateway=inet_addr(Info->GatewayList.IpAddress.String); IP=inet_addr(Info->IpAddressList.IpAddress.String); sMask=inet_addr(Info->IpAddressList.IpMask.String); in.s_addr=IP; printf("IP地址:%s\n",inet_ntoa(in)); in.s_addr=sMask; printf("子网掩码:%s\n",inet_ntoa(in)); in.s_addr=Gateway; printf("默认网关:%s\n",inet_ntoa(in)); printf("MAC地址:%02X-%02X-%02X-%02X-%02X-%02X\n\n",Mac[0],Mac[1],Mac[2],Mac[3],Mac[4],Mac[5]); Info=Info->Next; } free(Info); } WSACleanup(); return 0; } |
有关网卡信息的获取,更多资料:http://hi.baidu.com/cdutboy/blog/item/9c8bd030f1b49e10eac4af51.html