Linux网络编程---IP 地址格式转换函数

Linux网络编程---IP 地址格式转换函数

我们更容易阅读的IP地址是以点分十进制表示的,例如:192.168.5.10 ,这是一种字符串的形式,但是计算器所需要的IP地址是以二进制进行表示,这便需要我们在点分十进制字符串和二进制地址之间进行转换。

点分十进制字符串和二进制地址之间的转换函数主要有:inet_aton、inet_addr、inet_ntoa、inet_ntop、inet_pton 这五个,在使用它们时需要包含头文件<sys/socket.h>、<arpa/inet.h>以及<netinet/in.h>。

1 inet_aton、inet_addr、inet_ntoa 函数

这些函数可将一个 IP 地址在点分十进制表示形式和二进制表示形式之间进行转换,但是我们现在基本不用这些函数。

我们将介绍下述的两个函数完成我们的点分十进制字符串和二进制地址的转化。

2 inet_ntop 、inet_pton 函数

inet_ntop()、inet_pton()与 inet_ntoa()、inet_aton()类似,但它们还支持 IPv6 地址。它们将二进制 Ipv4 或Ipv6 地址转换成以点分十进制表示的字符串形式,或将点分十进制表示的字符串形式转换成二进制 Ipv4 或Ipv6 地址。

使用这两个函数需要包含头文件<arpa/inet.h>。

2.1 inet_pton()函数

inet_pton()函数将点分十进制表示的字符串形式转换成二进制 Ipv4 或 Ipv6 地址,它的函数原型如下所示:

c 复制代码
int inet_pton(int af, const char *src, void *dst);
  • 参数 af 必须是 AF_INET 或 AF_INET6,AF_INET 表示待转换的 Ipv4地址,AF_INET6 表示待转换的是 Ipv6 地址;
  • 如果参数 af 被指定为 AF_INET,则参数 dst 所指对象应该是一个 struct in_addr 结构体的对象;如果参数 af 被指定为 AF_INET6,则参数 dst 所指对象应该是一个 struct in6_addr 结构体的对象。
  • 字符串 src 表示需要转化的二进制,参数 dst 用于存放转化后得到的地址。

使用示例:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

#define IPV4_ADDR "192.168.5.10"

int main(void)
{
	struct in_addr addr;
	inet_pton(AF_INET, IPV4_ADDR, &addr);
	printf("ip addr: 0x%x\n", addr.s_addr);
	exit(0);
}

2.2 inet_ntop()函数

inet_ntop()函数执行与 inet_pton()相反的操作,函数原型如下所示:

c 复制代码
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  • 参数 src 应指向一个 struct in_addr 结构体对象或 struct in6_addr 结构体对象,依据参数 af 而定。
  • 函数inet_ntop()会将参数 src 指向的二进制 IP 地址转换为点分十进制形式的字符串,并将字符串存放在参数 dts 所指的缓冲区中,参数 size 指定了该缓冲区的大小。

示例:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(void)
{
	struct in_addr addr;
	char buf[20] = {0};
	addr.s_addr = 0xa05a8c0;
	inet_ntop(AF_INET, &addr, buf, sizeof(buf));
	printf("ip addr: %s\n", buf);
	exit(0);
}
相关推荐
道法自然0402几秒前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
yeyuningzi7 分钟前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
上辈子杀猪这辈子学IT26 分钟前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian
minihuabei31 分钟前
linux centos 安装redis
linux·redis·centos
EasyCVR1 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
lldhsds1 小时前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
明月看潮生2 小时前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
wowocpp2 小时前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君2 小时前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维2 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos