码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-07-31 00:04:18      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!