Unix网络编程随手记——IP处理函数inet_aton()、gethostbyname()等

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。

转载于:https://www.cnblogs.com/danieldachao/p/5721969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值