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示例)