linux IP 地址转换

IP地址转换(字符串ip - 整数,主机字节序和网络字节序的转换):

  通常,人们习惯用可读性好的字符串来表示 IP 地址,比如用  点分十进制  字符串表示 IPv4 地址,以及用 十六进制 字符串表示 IPv6 地址。

  但编程中我们需要把它们转化为整数(二进制数)方能使用。而记录日志时则相反,我们要把整数表示的 IP 地址转化为 可读的字符串。

  下面 3个 函数可用于用  点分十进制  字符串表示的 IPv4 地址和用网络字节序整数表示的 IPv4 地址之间的转换:

#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
char *inet_ntoa(struct in_addr in);
下面的这对更新的函数也能完成前面3个函数同样的功能, 并且它们同时适用 IPv4地址和 IPv6地址:常用
复制代码
#include <arpa/inet.h>
//p:点分十进制的 IP 字符串, n:表示 network, 网络字节序的整数
int inet_pton(int af, const char *src, void *dst);
  af:地址族:AF_INET AF_INET6
  src:需要转换的点分十进制的 IP 字符串
  dst:转换后的结果保存在这个里面
//将网络字节序的整数,转换成 点分十进制的 IP地址字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  af:地址族:AF_INET AF_INET6
  src:要转换的 IP的整数的地址
  dst:要转换成IP地址字符串保存的地方
  size:第三个参数的大小(数组的大小)
  返回值:返回转换后的数据的地址(字符串),和 dst 是一样的
复制代码

 案例:

复制代码
 1 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 int main()
 4 {
 5     //创建一个 IP 字符串, 点分十进制的 IP地址 字符串
 6     char buf[] = "192.168.1.4";
 7     unsigned int num = 0;
 8     //将点分十进制 IP 字符串转换成 网络字节序的整数
 9     inet_pton(AF_INET, buf, &num);
10     unsigned char * p = (unsigned char *)&num;
11     printf("%d %d %d %d\n", *p, *(p+1), *(p+2), *(p+3));//输出: 192 168 1 4
12     
13     //将网络字节序的 IP 整数转换成 点分十进制的 IP字符串
14     char ip[16] = "";// 192(3)   .(1)    168(3)    .(1)    1(3)    .(1)    4(3)   终止符(1)
15     const char * str = inet_ntop(AF_INET, &num, ip,16);//16 = sizeof(ip)
16     printf("%s\n", str);// 输出: 192.168.1.4 
17     printf("ip: %s\n", str);
18     printf("%d\n", ip == str);//1
19     return 0;
20 }
复制代码

 

posted on   廿陆  阅读(253)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示