inet_ntoa 和inet_addr函数

inet_ntoa 和inet_addr函数
#include
#include 
#include 

char* inet_ntoa(struct in_addr);

在ip字符串和ip地址见进行转换。例如:
如果得到了一个ip包,想要打印出它的ip地址(用点分十进制) ,则要用到inet_ntoa,(即network to ascii)

但它的参数是struct in_addr ;
首先来看看这个结构。
typedef u_int32_t in_addr_t;
struct in_addr
{
 in_addr_t s_addr;
};

可以看到,就是一个32位的数,只不过包装了一下。那么我的包是buffer,怎样得到了。

首先,定义ip结构。
struct iphdr* ip = (struct iphdr*)buffer;
在定义 struct in_addr  addr; 利用这个结构做个中介---->

addr.s_addr=(struct in_addr)(ip->saddr);

这样就可以用inet_ntoa函数了。
Char *some_addr=inet_ntoa(addr);
Printf(“%s\n”,some_addr);



而inet_addr函数是把店分十进制转为32位的ip结构的,可以用来构造包头。
in_addr_t inet_addr(char*ip);也即返回32位数字。typedef u_int32_t in_addr_t;


struct sockaddr_in saddr;
saddr.sin_addr.s_addr=inet_addr(“192.168.0.1”);

就把ip存放进去了。


这里可以把存储地址的几个结构理清下:

最上层的就是刚刚的结构
struct in_addr
{
 unsigned long int s_addr;
}//和上面的一样的。
然后是在应用程序中用的最多的套接子结构,封装了上面的ip地址。
struct sockaddr_in
{
	short sin_family;
	u_short sin_port;
	struct in_addr sin_addr;//这个就是上面的ip地址;
	char sin_zero[8];//这个是补齐和内涵中用的结构一样的长度,请看下面;
}//共16字节。

在就是在内核中用的最多的套接子结构
struct sockaddr
{
	u_short family;
	char sa_data[14];
}//共16字节。这个和上面的sockaddr_in 一个用在内核中,一个用在用户程序中。




参考:http://www.beej.us/guide/bgnet/output/html/multipage/inet_ntoaman.html

其实还有一个函数和inet_ntoa是互逆的关系,即inet_aton
它的原型是  int inet_aton(char *ip,struct *in_addr);
成功返回非0,失败返回0

例子:
struct sockaddr_in saddr;
inet_aton(“10.0.0.1”,&(saddr.sin_addr)),这样也把ip放入进去了。



你可能感兴趣的:(inet_ntoa 和inet_addr函数)