Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1661210
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 03:57:10

 网络信息获取函数和网卡信息获取
分类: 2.5 网络编程 252人阅读 评论(4) 收藏 举报

网络中的主机需要安装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     //第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://hi.baidu.com/cdutboy/blog/item/9c8bd030f1b49e10eac4af51.html


阅读(568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~