c语言 windows 判断用户输入的是一个域名还是一个ip地址,使用C语言判断一个IP 地址是否为私有地址(示例代码)...

这篇博客介绍了如何使用C语言在Windows环境下判断用户输入的IP地址是否属于私有地址范围,包括10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。通过解析socket结构体中的IP地址字段,并根据IP地址的前几个字节进行比较,实现判断逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://zhidao.baidu.com/question/191740827.html

私有IP地址范围:

A: 10.0.0.010.255.255.255 10.0.0.0/8

B: 172.16.0.0172.31.255.255 172.16.0.0/12

C: 192.168.0.0192.168.255.255 192.168.0.0/16

在C语言中的 socket 结构体如下

structsockaddr_in {shortsin_family;

USHORT sin_port;

IN_ADDR sin_addr;

CHAR sin_zero[8];

}

其中IP 地址字段为 sin_addr,当选择IPv4类型的IP地址时,sin_addr 是一个网络字节序的4字节的数字。

sample:

192.168.207.1

c0 a8 cf 01

Filter:

A: startwith 10.x.x.x

B: startwith 172.(16~31).x.x

C: startwith 192.168.x.x

判断顺序:

A -> C -> B

伪码如下:

char data[4] = NetworkAddr;

if data[0] == 10:

return true

elif data[0] == 192 and data[1] == 168:

return true

elif data[0] == 172:

if data[1] >= 16 and data[1] <= 31:

return true

else:

return False

#include #include#include

#pragma comment(lib,"ws2_32.lib") //inet_addr()BOOL isLocalAddr(DWORD netAddr)

{

unsignedchar data[4];

BOOL bRet=FALSE;

memcpy(data, (char *)&netAddr, 4);if (10 == data[0])

{

bRet=TRUE;

}else if (192 == data[0] && 168 == data[1])

{

bRet=TRUE;

}else if (172 == data[0])

{if (data[1] >= 16 && data[1] <= 31)

{

bRet=TRUE;

}

}else if(!memcmp(data, servAddr, 4))

{

bRet=TRUE;

}returnbRet;

}intmain()

{char *addrList[] ={"192.168.207.1","192.12.1.3","172.16.2.1","172.33.1.1","10.12.12.1","43.1.31.23",

};char *result[] ={"X Local Address","O Local Address"};int addrCnt = sizeof(addrList) / sizeof(addrList[0]);

DWORD netAddr= 0;

BOOL ret=FALSE;for (int i = 0; i < addrCnt; i++)

{

netAddr=inet_addr(addrList[i]);

ret=isLocalAddr(netAddr);

printf("%-16s [%s]\n", addrList[i], result[ret]);

}return 0;

}

运行结果:

0d42daabcdfa5a0f2eafe3c2ab37ab35.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值