字符串ip地址和数值ip转换

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
//形如"192.168.2.1"转换到数组和主机字节序
/*
typedef uint32_t in_addr_t;
struct in_addr{
	in_addr_t s_addr;
};

ip地址合法性
a.4个数字不能大于255
b.第一个数字不能为0
c.最后一个数字不能为0、255

***************************************************
@       :字符串ip转换成网络字节序ip,ip合法性检查 a
@in     :const char *__cp
@out    :struct in_addr *__inp
@return :success 1 fail 0
int inet_aton (const char *__cp, struct in_addr *__inp);


***************************************************
@       :字符串ip转换成网络字节序ip,ip合法性检查 a 
@in     :const char *__cp
@out    :
@return :in_addr_t 出错返回INADDR_NONE
in_addr_t inet_addr (const char *__cp);


//主机字节序ip地址如192.168.2.1转换字符串ip

***************************************************
@       :将网络序二进制IPv4地址转换成点分十进制数串,ip合法性检查 a 
@in     :struct in_addr __in
@out    :
@return :
char *inet_ntoa (struct in_addr __in);
*/

char * str_ip = "192.168.2.1";
//char * str_ip = "1.255.255.255";
main()
{
	int ret;
	uint32_t ip_v4;
	
	/*****************************************/
	struct in_addr ip_num;
	ret = inet_aton(str_ip, &ip_num);
	if(ret == 1)
	{
		ip_v4 = ntohl(ip_num.s_addr);//网络字节序转化为主机字节序
		printf("inet_aton success ip %x\n",ip_v4);
		printf("%u.%u.%u.%u\n",*((unsigned char*)&ip_v4+3),*((unsigned char*)&ip_v4+2),\
							   *((unsigned char*)&ip_v4+1),*((unsigned char*)&ip_v4));
	}
	else if(ret == 0)
	{
		printf("inet_aton fail\n");
	}
	
	/*****************************************/
	ip_v4 = inet_addr(str_ip);
	if( ip_v4 != INADDR_NONE ) //INADDR_NONE 255.255.255.255
	{
		ip_v4 = ntohl(ip_v4);
		printf("inet_addr success ip %x\n",ip_v4);
		printf("%u.%u.%u.%u\n",*((unsigned char*)&ip_v4+3),*((unsigned char*)&ip_v4+2),\
							   *((unsigned char*)&ip_v4+1),*((unsigned char*)&ip_v4));
	}
	else if(ret == 0)
	{
		printf("inet_addr fail\n");
	}
	struct in_addr addr1,addr2;
	uint32_t addr1_num,addr2_num;
	addr1_num = inet_addr("192.168.0.0");
	addr2_num = inet_addr("8.8.8.8");
	memcpy(&addr1,&addr1_num,4);
	memcpy(&addr2,&addr2_num,4);
	//这里注意
	printf("inet_ntoa %s:%s\n",inet_ntoa(addr1),inet_ntoa(addr2));
	printf("inet_ntoa %s\n",inet_ntoa(addr1));
	printf("inet_ntoa %s\n",inet_ntoa(addr2));
	
	return 0;
}


运行结果

inet_aton success ip c0a80201
192.168.2.1
inet_addr success ip c0a80201
192.168.2.1
inet_ntoa 192.168.0.0:192.168.0.0
inet_ntoa 192.168.0.0
inet_ntoa 8.8.8.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值