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 2023-10-11 22:45  廿陆  阅读(350)  评论(0)    收藏  举报

导航