纳金网

标题: 网络信息获取函数和网卡信息获取 [打印本页]

作者: 王者再临    时间: 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