inet_addr()和inet_aton()函数详解

         inet_addr()和inet_aton()这两个函数都将点分十进制格式的IPv4地址字符串转换为32位的网络字节序二进制值。

#include <arpa/inet.h>

in_addr_t inet_addr(const char*string);
/*
传递点分十进制格式的字符串,将其转换为32位整数型数据并返回。该函数可检查无效的ip地址,填写大于255的地址数据,将返回INADDR_NONE。成功返回32位大端序整数型值。

string:类似“192.168.1.1”的点分十进制格式的字符串

*/


int inet_aton(const char* string, struct in_addr*addr);
/* 
成功时返回1(true),失败时返回0(false)。
string:类似“192.168.1.1”的点分十进制格式的字符串
addr:保存转换结果的in_addr结构体变量的地址值
、该函数可检查无效的ip地址,失败返回0.
*/

inet_addr()和inet_aton()两个函数功能相同,都是将点分十进制类型的字符串转换为32位网络字节序并返回。只不过inet_aton()函数直接指定了返回的结构体地址值。

特性inet_addr()inet_aton()
返回值网络字节序的in_addr_t成功返回1,失败返回0
错误处理返回INADDR_NONE(通常-1)返回0表示失败
处理255.255.255.255可能失败(与错误值冲突)可以正确处理
输出参数无,直接返回值通过第二个参数输出
安全性不推荐使用(已过时)推荐使用

 使用示例

#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
	char* addr1 = "192.168.1.110";
	char* addr2 = "192.168.2.266";
	printf("addr1 = %s\n", addr1);
	//inet_addr()##############################
	if(inet_addr(addr1) == INADDR_NONE)
	{
		printf("error addr1\n");
	}
	else
		printf("inet_addr(addr1) = 0x%x\n",inet_addr(addr1));
	printf("addr2 = %s\n", addr2);
	
	if(inet_addr(addr2) == INADDR_NONE)
	{
		printf("error addr2\n");
	}
	else
		printf("inet_addr(addr2) = 0x%x\n", (unsigned)inet_addr(addr2));
	//inet_aton()###############################
	struct sockaddr_in addr_struct;
	memset(&addr_struct, 0, sizeof(addr_struct));
	if(inet_aton(addr1, &addr_struct.sin_addr))
		printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr);	
	else
		printf("inet_aton is error!\n");	
	if(inet_aton(addr2, &addr_struct.sin_addr))
		printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr);	
	else
		printf("inet_aton is error!\n");	
	return 0;
}

sockaddr_in 结构体:

struct sockaddr_in
{
    sa_family_t      sin_family;  //地址族(ADDress Family)
    uint16_t         sin_port;    //16位TCP/UDP端口号
    struct in_addr   sin_addr;    //32位ip地址  
    char             sin_zero[8]; //不使用,只是为了保证字节对齐
};

struct in_addr
{
    in_addr_t        s_addr;      //32位IPV4地址
};

 

输出结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值