IP地址转换函数inet_addr(),inet_aton(),inet_ntoa(),inet_pton()

一、把ip地址转化为用于网络传输的二进制数值

1、函数 inet_addr

in_addr_t inet_addr(const char *cp);

例子:
inet_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char *cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回-1,255.255.255.255是一个有效的地址,不过inet_addr无法处理;

打印函数:

    9 #define dump_mem(str, mem, len){ \                                                                                                                       
   10 |   if ((mem) && (len)) { \                                                                                                                              
   11 |   |   int i;  \                                                                                                                                        
   12 |   |   unsigned char *p = (unsigned char*)mem;\                                                                                                         
   13 |   |   int c; \                                                                                                                                         
   14 |   |   printf("[%s, %s@%d addr = %p len = 0x%x]: %s\n", __FILE__, __func__, __LINE__, (p), (len), str); \                                               
   15 |   |   for (i = 0; i < (len); i++) { \                                                                                                                  
   16 |   |   |   if (i % 16 == 0 && i != 0) { \                                                                                                               
   17 |   |   |   |   printf("\n"); \                                                                                                                          
   18 |   |   |   }\                                                                                                                                           
   19 |   |   |   c = p[i]; \                                                                                                                                  
   20 |   |   |   printf("0x%02x ", c); \                                                                                                                      
   21 |   |   } \                                                                                                                                              
   22 |   |   printf("\n"); \                                                                                                                                  
   23 |   }\                                                                                                                                                   
   24 } 
   26 int main(int argc, char *argv[])                                                                                                                         
   27 {                                                                                                                                                        
   28 |   int  ip_addr;                                                                                                                                        
   29 |   ip_addr = inet_addr("192.168.2.125");   //设置ip点分十进制地址的地址                                                                                 
   30 |   printf("0x%02x\n", ip_addr);              //打印转换后的网络字节序                                                                                   
-- 31 |   dump_mem("sss", &ip_addr, sizeof(int));                                                                                                              
   32 |   return 0;                                                                                                                                            
   33 }    

结果:

└──╼ $./test                                                                                                                             
0x7d02a8c0
[test.c, main@31 addr = 0x7ffd224dc868 len = 0x4]: sss
0xc0 0xa8 0x02 0x7d 

2、函数 inet_aton

inet_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值,并存储在struct in_addr结构中,即第二个参数*inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序)

int inet_aton(const char *cp, struct in_addr *inp);

例子

int ip_addr;
struct in_addr inet_ip_addr;
ip_addr = inet_aton("192.168.2.125", &inet_ip_addr);
printf("%d\n",inet_ip_addr.s_addr);    

二.将网络传输的二进制数值转化为成点分十进制的ip地址

1、inet_ntoa

char *inet_ntoa(struct in_addr in);

inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!
例子

struct in_addr network;
network.s_addr=2097326272;    //为s_addr赋值--网络字节序
printf("IP : %s\n", inet_ntoa(network));

2、inet_aton

参数 cp:传入的ip地址;inp 指向转换后存储到struct in_addr结构体的s_addr;

int ip_addr;
struct in_addr inet_ip_addr;
ip_addr = inet_aton("192.168.2.125", &inet_ip_addr);
printf("%d\n",inet_ip_addr.s_addr);    

三.新型网路地址转化函数inet_pton和inet_ntop

#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);     //将点分十进制的ip地址转化为用于网络传输的数值格式
        返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
 
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     //将数值格式转化为点分十进制的ip地址格式
        返回值:若成功则为指向结构的指针,若出错则为NULL

(1)这两个函数的family参数既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作为family参数,这两个函数都返回一个错误,并将errno置为EAFNOSUPPORT.

(2)第一个函数尝试转换由strptr指针所指向的字符串,并通过addrptr指针存放二进制结果,若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0.

(3)inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值