标签:
IP地址实质上就是一个32位的无符号整数,用如下结构体存放
1 struct in_addr 2 { 3 unsigned int s_addr; 4 };
由于历史原因,虽然IP地址只是个标量,却用一个结构体来存储。
由于主机可以有不同的主机字节顺序,即大端机或小端机。但TCP/IP定义了统一的网络字节顺序,大端字节顺序。
Unix提供了两个函数可在主机字节和网络字节间实现转换:
一、htonl()和ntohl()
在Linux系统下:
#include <arpa/inet.h>
有些系统包含的头文件是 <netinet/in.h> 而不是 <arpa/inet.h>
unsigned long int htonl(unsigned long int hostlong); //返回按网络字节顺序的值
unsigned long int ntohl(unsigned long int hostlong); //返回按主机字节顺序的值
"h"表示主机host,"n"表示网络network,"to"表示转换。
二、inet_aton()和inet_ntoa()
#include<arpa/inet.h>
int inet_aton(const char *cp,strcut in_addr *inp); //若成功返回1,出错则返回0
int inet_ntoa(strcut in_addr in); //返回指向点分十进制的指针
"n"表示网络network,"a"表示应用application,"to"表示转换。
inet_aton函数将一个点分十制串转换为一个网络字节顺序的IP地址,相似地,inet_ntoa函数将一个网络字节顺序的IP地址转换为它所对应的点分十进制串。注意,对inet_aton传的是指针,而inet_ntoa则传递的是结构体本身。
三、gethostbyname()和gethostbyaddr()
DNS数据库有很多DNS条目来存储域名和IP之间的映射,条目具体内容如下结构体所示
1 struct hostent 2 { 3 char * h_name; //official domain name of host 4 char ** h_aliases; //Null-terminated arraty of domain names 5 short h_addrtype; //Host address type (AF_INET) 6 short h_length; //Length of an address,in bytes 7 char ** h_addr_list; //Null-terminated arraty of in_addr structs 8 };
#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name); //若成功返回非NULL指针,若出错返回NULL,同时设置h_errno
struct hostent *gethostbyaddr(const char *addr,int len,0); //若成功返回非NULL指针,若出错返回NULL,同时设置h_errno
gethostbyname函数返回和域名name(如www.baidu.com)相关的主机条目
gethostbyaddr函数返回和IP地址addr相关的主机条目(网络字节顺序的地址),第二个参数给出了第一个IP地址的长度,对目前的因特网来说总是四个字节。对我们的要求来说,第三个参数总是0。
主机条目的具体内容,见上述结构体。IP地址和域名可能是一对一,多对一,一对多,也可能是多对多,甚至域名可能没有映射到任何IP。
Unix网络编程随手记——IP处理函数inet_aton()、gethostbyname()等
标签:
原文地址:http://www.cnblogs.com/danieldachao/p/5721969.html