网络地址格式及域名地址转化
来源:互联网 发布:上海it外包 编辑:程序博客网 时间:2024/06/05 17:31
网络地址格式转化
通常用户在表达地址时采用的是点分十进制表示的数值(或者是为冒号分开的十进制Ipv6地址),而在通常使用的socket编程中使用的则是32位的网络字节序的二进制值,这就需要将这两个数值进行转换。
这里在Ipv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPV4和Ipv6兼容的函数有inet_pton()和inet_ntop()。
IPv4的函数原型:
#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int inet_aton(const char *straddr, struct in_addr *addrptr);char *inet_ntoa(struct in_addr inaddr);in_addr_t inet_addr(const char *straddr);
函数inet_aton()
:将点分十进制数的IP地址转换成为网络字节序的32位二进制数值。
返回值:成功,则返回1,不成功返回0.
参数说明
参数straddr
:存放输入的点分十进制数IP地址字符串。
参数addrptr
:传出参数,保存网络字节序的32位二进制数值。
函数inet_ntoa()
:将网络字节序的32位二进制数值转换为点分十进制的IP地址。
函数inet_addr()
:功能与inet_aton相同,但是结果传递的方式不同。inet_addr()若成功则返回32位二进制的网络字节序地址。
IPv4和IPv6的函数原型:
#include <arpa/inet.h>int inet_pton(int family, const char *src, void *dst);const char *inet_ntop(int family, const void *src, char *dst, socklen_t len);
函数inet_pton
跟inet_aton
实现的功能类似,只是多了family参数,该参数指定为AF_INET
,表示是IPv4协议,如果是AF_INET6
,表示IPv6协议。
函数inet_ntop
跟inet_ntoa
类似,其中len表示表示转换之后的长度(字符串的长度)。
转换实例:
#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int main(){ char ip[] = "192.168.121.128"; int iRet; struct in_addr myaddr; inet_aton(ip, &myaddr); printf("myaddr.s_addr = %x\n", myaddr.s_addr); printf("inet_addr(ip) = %x\n", inet_addr(ip)); /* inet_pton */ iRet = inet_pton(AF_INET, ip, &myaddr); printf("myaddr.s_addr = %x\n", myaddr.s_addr); myaddr.s_addr = 0xac100ac4; /* inet_ntoa */ printf("inet_ntoa(myaddr) = %s\n", inet_ntoa(myaddr)); /* inet_ntop */ inet_ntop(AF_INET, &myaddr, ip, 16); printf("ip = %s\n", ip); return 0;}
执行结果
myaddr.s_addr = 8079a8c0inet_addr(ip) = 8079a8c0myaddr.s_addr = 8079a8c0inet_ntoa(myaddr) = 196.10.16.172ip = 196.10.16.172
域名地址转化
通常,人们在使用过程中都不愿意记忆冗长的IP地址,尤其到Ipv6时,地址长度多达128位,那时就更加不可能一次性记忆那么长的IP地址了。
使用主机名或域名将会是很好的选择。
主机名与域名的区别:主机名通常在局域网里面使用,通过/etc/hosts
文件,主机名可以解析到对应的ip;域名通常是再internet上使用。
众所周知,百度的域名为:www.baidu.com
,而这个域名其实对应了一个百度公司的IP地址,那么百度公司的IP地址是多少呢?
我们可以利用ping www.baidu.com
来得到百度公司的ip地址。那么,系统是如何将www.baidu.com 这个域名转化为IP地址220.181.111.148
的呢?
在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname()、gethostbyaddr()
等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。
其中gethostbyname()
是将主机名转化为IP地址,gethostbyaddr()
则是逆操作,是将IP地址转化为主机名。
函数原型:
#include <netdb.h>struct hostent* gethostbyname(const char* hostname);struct hostent* gethostbyaddr(const char* addr, size_t len, int family);
hostent
结构体:
struct hostent{ char *h_name; /*正式主机名*/ char **h_aliases; /*主机别名*/ int h_addrtype; /*主机IP地址类型 IPv4为AF_INET*/ int h_length; /*主机IP地址字节长度,对于IPv4是4字节,即32位*/ char **h_addr_list; /*主机的IP地址列表*/}#define h_addr h_addr_list[0] /*保存的是ip地址*/
函数gethostbyname()
:用于将域名(www.baidu.com
)或主机名转换为IP地址。
参数hostname
指向存放域名或主机名的字符串。
程序实例(联网下操作):
/*getAddr.c*/#include <netdb.h>#include <sys/socket.h>#include <stdio.h>int main(int argc, char *argv[]){ if(argc != 2){ printf("args err\n"); } char *ptr, **pptr; struct hostent *hptr; char str[32] = {'\0'}; /*ptr为要解析的域名或主机名*/ ptr = argv[1]; /*得到主机名字和地址信息的指针*/ if((hptr = gethostbyname(ptr)) == NULL){ printf("gethostbyname err\n"); return 0; } printf("规范主机名为: %s\n", hptr -> h_name); /*打印别名*/ for(pptr = hptr->h_aliases; *pptr != NULL; pptr++){ printf("别名:%s\n", *pptr); } switch(hptr->h_addrtype){ case AF_INET: case AF_INET6: pptr = hptr->h_addr_list; /* 将刚才得到的所有地址都打印*/ for(; *pptr!=NULL; pptr++){ printf(" address:%s\n", (char*)inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); } printf(" first address: %s\n", (char*)inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str))); break; default: printf("未知地址类型\n");break; } return 0;}
程序编译及执行结果:
yu@ubuntu:~/Linux/214/baidu$ lsgetAddr.cyu@ubuntu:~/Linux/214/baidu$ gcc -o getAddr getAddr.cyu@ubuntu:~/Linux/214/baidu$ ./getAddr www.baidu.com规范主机名为: www.a.shifen.com别名:www.baidu.com address:14.215.177.38 address:14.215.177.37 first address: 14.215.177.38yu@ubuntu:~/Linux/214/baidu$ ./getAddr www.12306.com规范主机名为: fw.ename.net别名:www.12306.com address:198.148.92.57 address:198.148.92.56 address:198.148.92.58 first address: 198.148.92.57
- 网络地址格式及域名地址转化
- 8.1 域名及网络地址
- 域名及网络地址(Linux----C)
- 第八章 域名及网络地址
- 网络地址兼容域名和点分十进制IP地址
- php获取用户ip地址,及格式转化存储
- 将网络地址(u_long)转化为点分十进制ip地址
- 域名转化到IP地址的实现
- 域名和网络地址
- NAT--网络地址转化
- VMware Funsion 修改vmnet1/vmnet8默认网络地址及DHCP地址
- 利用DNS类.域名转化ip地址,利用ip地址转换域名
- 网络地址与主机地址
- 计算IP地址,网络地址
- IEEE地址和网络地址
- 子网掩码,网络地址,广播地址
- 网络地址和主机地址
- inet_ntoa只能转化IP地址 不能转域名的问题
- android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch
- 堆和栈的区别
- jpa
- Android类参考---Fragment
- Systemctl command
- 网络地址格式及域名地址转化
- dp和px的区别
- 初看信息资源管理
- redHat5 local resposity yum install mysql
- JAVA之Annotation(注释)
- 全面复习之SQL(5)-视图
- WebView加载HTML图片大小自适应与文章自动换行
- 1044. Shopping in Mars (25)
- Android Camera 代码阅读: Preview过程