Linux 伺服器和客戶端資訊獲取(二)
阿新 • • 發佈:2021-02-16
技術標籤: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;
}