1. 程式人生 > 其它 >Linux 伺服器和客戶端資訊獲取(二)

Linux 伺服器和客戶端資訊獲取(二)

技術標籤:linux

文章目錄

ip地址轉換

一、字串IP地址和二進位制IP地址的轉換

計算機理解的則是像0x0111111100000000000000000000001 ( 127.0.0.1 ) 這樣表達的IP地址方式。在網路程式的設計中,經常需要進行字串表達方式的IP地址和二進位制的IP地址之間的轉換。

二、轉換例項

1、初始化設定

先對程式進行初始化的必要設定。例如測試的字串IP地址、使用者儲存結果的網路地址結構和IP地址結構等引數。

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
int main(){
struct in_addr ip,local,network;
char addr1[]="192.168.1.1";      /*a.b.c.d型別的網路地址字串*/
char addr2[]="255.255.255.255"; /*二進位制值全為1的IP地址對應的字串*/ char addr3[]="192.16.1"; /*a.b.c型別的網路地址字串*/ char *str=NULL,*str2=NULL; int err=0;

2、測試函式inet_aton()

測試函式inet_aton(),將字串IP地址192.168.1.1轉換成二進位制IP地址,並將結果打印出來。

err=inet_aton(addr1,&ip);
if(err){
printf("inet_aton:string %s vlaue is:0x%x\n"
,addr1,ip.s_addr); }else{ printf("inet_aton:string %s error\n",addr1); }

3、測試函式inet_addr()

測試函式inet_addr(),將字串IP地址轉換為二進位制IP地址。先測試192.168.1.1,再測試255.255.255.255。

ip.s_addr=inet_addr(addr1);
if(err!=-1){
printf("inet_addr:string %s value is:0x%x\n",addr1,ip.s_addr);
}
else{
printf("inet_addr:string %s value is error\n",addr1);
};
ip.s_addr=inet_addr(addr2);
if(ip.s_addr!=-1){
printf("inet_addr:string %s value is 0x%x\n",addr2,ip.s_addr);
}else{
printf("inet_addr:string %s error\n",addr2);
};

4、測試函式inet_ntoa()

測試函式inet_otoa(),先測試IP地址192.168. 1.1對應的字串礎,然後測試IP 地址255.255.255.255 對應的字串IP地址str2。兩個IP 地址都轉換完畢後,一起列印轉換後的值,會發現str 和str2 的值是相同的。

ip.s_addr=192<<24|168<<16|1<<8|1;
str=inet_ntoa(ip);
ip.s_addr=255<<24|255<<16|255<<8|255;
str2=inet_ntoa(ip);
printf("inet_ntoa:ip:0x%xstring1 %s,pre is:%s \n",ip.s_addr,str2,str);

5、測試函式addr()

測試函式inet_addr(),將字串IP地址轉換為二進位制IP地址,使用的字串為192.16.1。

ip.s_addr=inet_addr(addr3);
if(err!=-1){
printf("inet_addr:string %s value is:0x%x\n",addr3,ip.s_addr);
}else{
printf("inet_addr:string %s error\n",addr3);
};
str=inet_ntoa(ip);
printf("inet_nota:string %s ip:0x%x \n",str,ip.s_addr);

6、測試函式inet_lnaof()

測試函式inet_lnaof(),獲得本機地址。這個函式只取四段式IP地址的最後一段。

inet_aton(addr1,&ip);
local.s_addr=htonl(ip.s_addr);
local.s_addr=inet_lnaof(ip);
str=inet_ntoa(local);
printf("inet_lnaof:string %s ip:0x%x \n",str,local.s_addr);

7、測試函式inet_lnaof()

測試函式inet_lnaof(),獲得本機地址。這個函式只取四段式IP地址的前三段。

network.s_addr=inet_netof(ip);
printf("inet_netof:value:0x%x\n",network.s_addr);
return 0;
}

8、編譯執行程式

在這裡插入圖片描述

三、源程式程式碼

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
int main(){
struct in_addr ip,local,network;
char addr1[]="192.168.1.1";
char addr2[]="255.255.255.255";
char addr3[]="192.16.1";
char *str=NULL,*str2=NULL;

int err=0;

err=inet_aton(addr1,&ip);
if(err){
printf("inet_aton:string %s vlaue is:0x%x\n",addr1,ip.s_addr);
}else{
printf("inet_aton:string %s error\n",addr1);
}

ip.s_addr=inet_addr(addr1);
if(err!=-1){
printf("inet_addr:string %s value is:0x%x\n",addr1,ip.s_addr);
}
else{
printf("inet_addr:string %s value is error\n",addr1);
};
ip.s_addr=inet_addr(addr2);
if(ip.s_addr!=-1){
printf("inet_addr:string %s value is 0x%x\n",addr2,ip.s_addr);
}else{
printf("inet_addr:string %s error\n",addr2);
};

ip.s_addr=192<<24|168<<16|1<<8|1;
str=inet_ntoa(ip);
ip.s_addr=255<<24|255<<16|255<<8|255;
str2=inet_ntoa(ip);
printf("inet_ntoa:ip:0x%xstring1 %s,pre is:%s \n",ip.s_addr,str2,str);

ip.s_addr=inet_addr(addr3);
if(err!=-1){
printf("inet_addr:string %s value is:0x%x\n",addr3,ip.s_addr);
}else{
printf("inet_addr:string %s error\n",addr3);
};
str=inet_ntoa(ip);
printf("inet_nota:string %s ip:0x%x \n",str,ip.s_addr);

inet_aton(addr1,&ip);
local.s_addr=htonl(ip.s_addr);
local.s_addr=inet_lnaof(ip);
str=inet_ntoa(local);
printf("inet_lnaof:string %s ip:0x%x \n",str,local.s_addr);

network.s_addr=inet_netof(ip);
printf("inet_netof:value:0x%x\n",network.s_addr);
return 0;
}