获取计算机的IP地址

来源:互联网 发布:淘宝阿尔法软件 编辑:程序博客网 时间:2024/06/07 21:27

互联网协议地址(Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address)。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异


可以通过cmd下的IPconfig命名获取计算机中的IP地址

打开cmd


输入ipconfig命令


在编程中可以通过使用Winsock库实现获取IP地址


需要看几个函数:


WSAStartup函数

函数名:WSAStartup

函数原型::int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

函数功能:初始化Winsock库
参数: wVersionRequested:接收一个WORD型整数,低位表示主版本号,高位表示子版本号
lpWSAData:WSADATA结构指针,保存函数获得的Winsock信息

sockaddr_in结构体用于保存客户的地址
struct sockaddr_in
{
short sin_family //地址族,Winsock中必须是AF_INET
unsigned short sin_port    //网络字节序的端口号
struct in_addr  //网络字节序的IP地址
char sin_zero[8] //没有用,只是为了增加8个字节长度
}

使用此结构体和sockaddr结构体长度一致

scokaddr_in用来存储主机的地址信息,但是主机的IP和端口必须为网络字节序。通常人们所说的IP“192.168.0.10”,
端口80等都是主机字节序

网络字节序和主机字节序之间的转换

短整型转换notohs转换为htons
u_short notohs (    //将网络字节序u_short转换为主机字节序
    u_short netshort   //要转换的u_short
);

u_short  htons (       //将主机字节序u_short转换成网络字节序
u_short   host short   //要转换的u_short
);

IP地址转换   Inet_addr  与  inet_ntoa
unsingned  long   inet_addr(   //将字符串(例如"192.168.0.10")转换为u_long类型
const    char FAR *cp
);


char FAR * inet_ntoa (   //精sockaddr_in结构体中的sin_addr转换为字符串
struct   in_addr in
);

程序代码
[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <winsock2.h>  
  3.   
  4. //连接Winsock库  
  5. #pragma comment(lib, "ws2_32.lib")  
  6.   
  7. void main()  
  8. {  
  9.     //调用WSAtartup初始化Winsock库  
  10.     WSADATA wsaData;  
  11.     ::WSAStartup(  
  12.         MAKEWORD(2,2),//版本号为2.2  
  13.         &wsaData  
  14.         );  
  15.   
  16.     char szHost[256];//存放主机名的缓冲区  
  17.   
  18.     ::gethostname(szHost, 256);//取得本地主机名称  
  19.   
  20.     hostent *pHost = ::gethostbyname(szHost);//通过主机名得到地址信息  
  21.   
  22.     //一个主机可能有多个网卡、多个IP、下面的代码输出所有的IP地址  
  23.     in_addr addr;  
  24.   
  25.     for(int i=0; ; i++)  
  26.     {  
  27.         //获得地址(网络字节)  
  28.         char *p = pHost->h_addr_list[i];  
  29.   
  30.         if(NULL == p)  
  31.         {  
  32.             break;//退出循环  
  33.         }  
  34.   
  35.         //将地址拷贝到in_addr结构体中  
  36.         memcpy(&addr.S_un.S_addr, p, pHost->h_length);  
  37.   
  38.         //将in_addr转换为主机字节序  
  39.         char *strIP = ::inet_ntoa(addr);  
  40.   
  41.         //打印IP地址  
  42.         printf("本机IP[%d]: %s\n", i+1, strIP);  
  43.     }  
  44.   
  45.     //打印主机名  
  46.     printf("主机名:%s\n", szHost);  
  47.   
  48.     system("pause");  
  49. }  

执行结果
0 0
原创粉丝点击