查看: 528|回复: 0
打印 上一主题 下一主题

[其他] 网络信息获取函数和网卡信息获取

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-9-30 01:37:25 |只看该作者 |倒序浏览

网络中的主机需要安装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;
}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-13 19:36 , Processed in 0.063341 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部