纳金网
标题:
网络信息获取函数和网卡信息获取
[打印本页]
作者:
王者再临
时间:
2015-9-30 01:37
标题:
网络信息获取函数和网卡信息获取
网络中的主机需要安装TCP/IP协议或其他协议才能进行通信,网络应用程序有时需要获取主机上与网络有关的信息,这些信息一般存放在数据文件中。与网络有关的信息主要包括以下4大类:
·主机信息:与主机有关的信息,函数名一般以gethostby开头,在程序中较多使用。
·网络信息:与网络有关的信息,函数名一般以getnetby开头,在程序中较少使用。
·协议信息:与网络协议有关的信息,函数名一般以getprotoby开头,在程序中较少使用。
·服务信息:与网络提供的服务有关的信息,函数名一般以getservby开头,在程序中较多使用。
以下为获取网络信息的程序,代码如下:
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
#include <Iphlpapi.h> //第8版块所需要的头文件,需SDK
#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://go.narkii.com/club/)
Powered by Discuz! X2.5