基本思路:
要判断两个IP地址是否在同一个网段,将它们的IP地址分别与子网掩码做与运算,得到的结果为网络号,如果网络号相同,就在同一子网,否则,不在同一子网
用strtok切割字符串,可以实现把IP地址切割的功能,下面的处理还没做,先贴上分割代码,其余的就是组合字符串。
#include "stdafx.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char mask[] = "255.255.256.0";
char* result = NULL;
result = strtok(mask, ".");//第一次分割完后str变为第一段字符,剩下段的字符存储在静态区
while (result != NULL)
{
printf("%s\n", result);
result = strtok(NULL, ".");//剩下几次调用str位置用NULL
}
return 0;
}
//说明:如何判断两个IP地址是否在同一网段中,判断依据为:每个IP与掩码相与,结果相同为0,不同为1,ip类型不合适为2
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<iostream>
#include<string>
using namespace std;
typedef struct IPstruct
{
int first;
int second;
int third;
int fourth;
int Isip;
};
IPstruct Segment_str(char* mask_addr)
{
IPstruct ipnum;
ipnum.Isip = 0;
string Smask_addr = string(mask_addr);
int index = 0;
ipnum.first = atoi(&Smask_addr[0]);
if (ipnum.first > 255 || ipnum.first < 0)
{
ipnum.Isip = 2;
}
index++;
index = Smask_addr.find_first_of('.', index);
ipnum.second = atoi(&Smask_addr[++index]);
if (ipnum.second > 255 || ipnum.second < 0)
{
ipnum.Isip = 2;
}
index++;
index = Smask_addr.find_first_of('.', index);
ipnum.third = atoi(&Smask_addr[++index]);
if (ipnum.third > 255 || ipnum.third < 0)
{
ipnum.Isip = 2;
}
index++;
index = Smask_addr.find_first_of('.', index);
ipnum.fourth = atoi(&Smask_addr[++index]);
return ipnum;
if (ipnum.fourth > 255 || ipnum.fourth < 0)
{
ipnum.Isip = 2;
}
}
int checkNetSegment(char* mask_addr, char* ip1_addr, char* ip2_addr)
{ //SE=segment
IPstruct SE_mask_addr, SE_ip1_addr, SE_ip2_addr;
SE_mask_addr = Segment_str(mask_addr);
SE_ip1_addr = Segment_str(ip1_addr);
SE_ip2_addr = Segment_str(ip2_addr);
int ISIP;
if (SE_mask_addr.Isip == 2 || SE_mask_addr.Isip == 2 || SE_mask_addr.Isip == 2)
return 2;
else
{
SE_ip1_addr.first = SE_ip1_addr.first & SE_mask_addr.first;
SE_ip1_addr.second = SE_ip1_addr.second & SE_mask_addr.second;
SE_ip1_addr.third = SE_ip1_addr.third & SE_mask_addr.third;
SE_ip1_addr.fourth = SE_ip1_addr.fourth & SE_mask_addr.fourth;
SE_ip2_addr.first = SE_ip2_addr.first & SE_mask_addr.first;
SE_ip2_addr.second = SE_ip2_addr.second & SE_mask_addr.second;
SE_ip2_addr.third = SE_ip2_addr.third & SE_mask_addr.third;
SE_ip2_addr.fourth = SE_ip2_addr.fourth & SE_mask_addr.fourth;
if (SE_ip2_addr.first == SE_ip1_addr.first&&SE_ip2_addr.second == SE_ip1_addr.second&&SE_ip2_addr.third == SE_ip1_addr.third&&SE_ip2_addr.fourth == SE_ip1_addr.fourth)
return 0;
else
return 1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* mask_addr = "255.255.256.0";
char* ip1_addr="192.168.0.1";
char* ip2_addr ="192.168.0.3";
int a=checkNetSegment(mask_addr,ip1_addr,ip2_addr);
while (1);
return 0;
}