C语言中判断两个IPv4地址是否属于同一个子网的代码
发布时间 - 2026-01-11 03:25:43 点击率:次问题描述:

现给定两个IPv4地址,和一个子网掩码,判断是否属于同一个子网,若属于,输出1,否则输出0。
例如输入:
172.16.1.3
172.16.1.35
255.255.255.224
输出:
0
解决方案:
首先将字符串格式的IP地址转化为4字节的IP地址,然后使用与(&)运算,分别将两个IP地址与掩码相与,若最后的值相同,则为同一个子网,否则不是。
以下函数的作用是将字符串格式的IP转化为4字节的IP(因为是4字节,所以使用int,但不同平台的int所占的字节好像不同哈~不太确定)
int _to_int(char * str, int start_idx, int end_idx)
{
int a = 0, i;
for (i = start_idx; i <= end_idx; ++i)
{
a = a * 10 + (str[i] - '0');
}
return a;
}
/*
* 将ip字符串转化为4字节的整形
*/
int ip_to_int(char * ip)
{
int start = 0, i = 0, ret = 0;
int shift_factor = 3; // 一开始要向右移动3 * 8位
char c;
while (c = ip[i])
{
if (c == '.')
{
int a = _to_int(ip, start, i - 1);
int temp = shift_factor * 8;
ret = ret | (a << temp);
shift_factor--;
start = i + 1;
}
i++;
}
return ret;
}
_to_int()函数的作用是将一段字符串转化为数字,实际上就是将点分隔的字符串转化为数字,ip_to_int()函数将字符串格式的ip转化为整形。
以下是ip地址与子网掩码运算的部分:
#include <stdio.h>
int main()
{
char a1[15], a2[15], a3[15];
gets(a1);
gets(a2);
gets(a3);
int ip1 = ip_to_int(a1);
int ip2 = ip_to_int(a2);
int ip3 = ip_to_int(a3);
int result = 0;
if ((ip1 & ip3) == (ip2 & ip3))
{
result = 1;
}
printf("%d", result);
return 0;
}
下面是其它网友的补充
题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
/*
* 功能: 判断两台计算机IP地址是同一子网络。
* 输入参数: String Mask: 子网掩码,格式:“255.255.255.0”;
* String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
* String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
*
* 返回值: 0:IP1与IP2属于同一子网络; 1:IP地址或子网掩码格式非法; 2:IP1与IP2不属于同一子网络
*/
public int checkNetSegment(String mask, String ip1, String ip2)
{
/*在这里实现功能*/
return 0;
}
输入描述:
输入子网掩码、两个ip地址
输出描述:
得到计算结果
输入例子:
255.255.255.0
192.168.224.256
192.168.10.4
输出例子:
1
解答代码:
#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef struct ip
{
int first;
int second;
int three;
} IP;
int judgeIp(string ipSubNet,IP &ip)
{
int index=0;
ip.first=atoi(&ipSubNet[index]);
if(ip.first>255)
return 0;
index++;
index=ipSubNet.find_first_of('.',index);
ip.second=atoi(&ipSubNet[++index]);
if(ip.second>255)
return 0;
index++;
index=ipSubNet.find_first_of('.',index);
ip.three=atoi(&ipSubNet[++index]);
if(ip.three>255)
return 0;
index++;
index=ipSubNet.find_first_of('.',index);
ip.fouth=atoi(&ipSubNet[++index]);
if(ip.fouth>255)
return 0;
return 1;
}
int main()
{
string ipSubNet,ipAdd1,ipAdd2;
IP subNet,ip1,ip2;
while(cin>>ipSubNet>>ipAdd1>>ipAdd2)
{
if(judgeIp(ipSubNet,subNet)&&judgeIp(ipAdd1,ip1)&&judgeIp(ipAdd2,ip2))
{
ip1.first=ip1.first & subNet.first;
ip1.second=ip1.first & subNet.second;
ip1.second=ip1.first & subNet.second;
ip1.fouth=ip1.first & subNet.fouth;
ip2.first=ip2.first & subNet.first;
ip2.second=ip2.first & subNet.second;
ip2.second=ip2.first & subNet.second;
ip2.fouth=ip2.first & subNet.fouth;
if(ip1.first==ip2.first&&ip1.second==ip2.second&&ip1.three==ip2.three&&ip1.fouth==ip2.fouth)
cout<<'0'<<endl;
else
cout<<'2'<<endl;
}
else
cout<<'1'<<endl;
}
return 0;
}
C语言——如何判断两个IP在同一网段
ip_addr.h
#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
(mask)->addr) == \
((addr2)->addr & \
(mask)->addr))
在程序中,那个“\”表示它之前的程序和后面的是连接的,下一行和上一行是一个语句, 反斜杠符号起到长代码分行书写功能。
注意:C语言中的关键字不可以用“\”分行!
到这里,这篇关于C语言中判断ip是否在同一子网的文章就结束到这。
# 两个IP地址
# 子网
# C语言实现linux网卡连接检测的方法
# C语言+shell实现linux网卡状态检测
# 子网掩码
# 转化为
# 两台
# 在同一
# 后为
# 的是
# 网中
# 是一个
# 在这里
# 不太
# 可以用
# 均为
# 可以看到
# 这篇
# 不属于
# 要向
# 所占
# 则为
# 返回值
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何为API编写文档_Laravel API文档生成与维护方法
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel安装步骤详细教程_Laravel环境搭建指南
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
新三国志曹操传主线渭水交兵攻略
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
香港服务器租用费用高吗?如何避免常见误区?
Swift开发中switch语句值绑定模式
Laravel如何实现API速率限制?(Rate Limiting教程)
如何有效防御Web建站篡改攻击?
如何用PHP快速搭建高效网站?分步指南
焦点电影公司作品,电影焦点结局是什么?
简历没回改:利用AI润色让你的文字更专业
Bootstrap CSS布局之列表
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Laravel如何实现本地化和多语言支持?(i18n教程)
b2c电商网站制作流程,b2c水平综合的电商平台?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何实现多对多模型关联?(Eloquent教程)
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
中国移动官方网站首页入口 中国移动官网网页登录
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
微信小程序 wx.uploadFile无法上传解决办法
,在苏州找工作,上哪个网站比较好?
,网页ppt怎么弄成自己的ppt?
iOS UIView常见属性方法小结
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
网站制作免费,什么网站能看正片电影?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
JavaScript如何实现音频处理_Web Audio API如何工作?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel如何处理文件下载请求?(Response示例)

