把无符号整数主机字节序数据,输出IP并判断属于哪一类网络(输入整数输出对应的ip地址与分类)

代码是从键盘输入一个0-(4,294,967,296-1)以内的数(因为ip的长度为32位,因此输入的数不能超出2^32),然后输出对应的IP地址与对应的IP地址所在的分类
/*
 *输入一个无符号整数主机字节序数据,输出属于哪一类网络
 */

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

int main()
{
	//循环输入,判断
	while(1)
	{
		unsigned int num =  -1;
		
		printf("请输入一个无符号整数(0结束):");
		int ret = scanf("%d",&num);
		
		if(num==0)//输入正常退出整个程序
			break;
		//判断是否输入的是非数字,如果输入了其他东西导致复制不成功就退出程序
		if(ret == 0)
		{
			printf("赋值失败!请重新启动程序\n");
			break;
		}
		//printf("%x\n",num);

		//先转成网络字节序
		uint32_t nstr = htonl(num);

		//定义一个ip地址结构体
		struct in_addr in;
		
		//转为ip
		in.s_addr = nstr;
		char *p = inet_ntoa(in);

		printf("%s\n",p);

		//原因:把字符串转为数字,因为IP中带有小数点转换时会自动去掉小数点后面的转为int型,只会取到IP地址的第一个小数点前的数
		int a = atoi(p);
		
		//开始判断该地址是哪一类地址
		if(0<=a && a<128)
			printf("A类地址\n");	
		

		else if(a<192)
			printf("B类地址\n");	


		else if(a<223)
			printf("C类地址\n");	
		

		else if(a<239)
			printf("D类地址\n");

		
		else if(a<247)
			printf("E类地址\n");

		//当大于247(组播地址就当是输入的地址有误)
		else
			printf("输入的数非地址,请重新输入\n");
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值