inet_ntoa 和inet_addr函数
#include<sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
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函数
最新推荐文章于 2022-10-17 23:37:59 发布