网络字节序与IP字符串函数详解

文章详细介绍了在C语言中,如何使用inet_addr和inet_aton函数将IP字符串转换为网络字节序的无符号32位整数,以及如何使用inet_ntoa函数将网络字节序的IP地址转换回点分十进制的IP字符串。这两个函数在处理网络通信时非常关键。
摘要由CSDN通过智能技术生成

网络字节序与IP字符串

1 IP字符串转换成网络字节序

1.1 inet_addr函数

a. 头文件
需额外添加以下头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

b. 函数原型
in_addr_t inet_addr(const char *cp);
in_addr_t:函数返回值类型,本质上是无符号32位整型类型。
inet_addr:函数名。
const char *cp:参数,即一个指向字符数组的指针。

c. 功能
将cp指向的IP字符串转成网络字节序。
将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址。

d. 返回值
成功返回网络字节序,失败返回INADDR_NONE [0xffffffff]。

e. 注意点
不能识别255.255.255.255。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, const char *argv[])
{
	in_addr_t net_ip;
	char buf[100] = "192.168.34.214";

	net_ip = inet_addr(buf);

	if(net_ip == INADDR_NONE)
	{
		perror("Fail to inet_addr");
		return -1;
	}

	printf("net_ip = %#x\n",net_ip);

	return 0;
}

在这里插入图片描述

1.2 inet_aton函数

a. 头文件
需额外添加以下头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

b. 函数原型
int inet_aton(const char *cp, struct in_addr *inp);
int:函数返回值类型。
inet_aton:函数名。
const char *cp:IP字符串首地址。
struct in_addr *inp:存放网络字节序的地址。

c. 功能
将cp指向的IP字符串转成网络字节序并保存到结构体的地址中。

d. 返回值
成功返回非0,失败返回0。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, const char *argv[])
{
	struct in_addr net_ip;
	int ret  = 0;
	char buf[100] = "192.168.34.214";

	ret = inet_aton(buf,&net_ip);

	if(ret == 0)
	{
		perror("Fail to inet_addr");
		return -1;
	}

	printf("net_ip : %#x\n",net_ip.s_addr);

	return 0;
}

在这里插入图片描述

2. 网络字节序转IP字符串

a. 头文件
需额外添加以下头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

b. 函数原型
char *inet_ntoa(struct in_addr in)
char *:函数返回值类型,直接返回IP字符串首地址。
inet_ntoa:函数名。
struct in_addr in:IP网络字节序。

c. 功能
将网络字节序转换成IP字符串。
32位的网络字节顺序的IP信息转换成点分十进制的字符串方式

d. 返回值
成功返回IP字符串首地址,失败返回NULL。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, const char *argv[])
{
	struct in_addr net_ip;
	int ret  = 0;
	char *host_ip = NULL;
	char buf[100] = "192.168.34.214";

	ret = inet_aton(buf,&net_ip);

	if(ret == 0)
	{
		perror("Fail to inet_addr");
		return -1;
	}

	printf("net_ip : %#x\n",net_ip.s_addr);

	host_ip = inet_ntoa(net_ip);
	if(host_ip == NULL)
	{
		perror("Fail to inet_ntoa");
		return -1;
	}

	printf("host_ip: %s\n",host_ip);

	return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值