計算子網包含多少ip(windows網絡編程學習筆記)

一、計算子網原理
1.將IP地址與子網掩碼按位與,即可計算出子網地址:
  <子網地址> = <IP地址> & <子網掩碼>

2.將子網掩碼按位非,然後在ip地址按位或運算得出廣播地址:
  <廣播地址> = <IP地址> | (~<子網掩碼>)

二、具體實現:

#include<stdio.h>
#include<WinSock2.h>
#include<regex>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

//正則表達式校驗ip合法性
bool isValidIP(const char *ip){
	   if(ip == NULL)
		      return false;
	   regex pattern("^(?!^255(\.255){3}$)(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])(\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)){2}\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$");

   	return regex_match(ip,pattern);
}

//校驗子網掩碼的合法性
bool isValidMask(const char *mask){
	    if(mask == NULL)	
	       	return false;
	    regex pattern("^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$");
	    
	    return regex_match(mask,pattern);
}
bool  calculateSubnet(const char *ip,const char *mask){
    	if(ip == NULL || mask == NULL){
		      return false;
	    }
	    printf("ip = %s\n",ip);
    if(!isValidIP(ip)){
	       	printf("invalid ip\n");
       		getchar();
	       	exit(0);
	    }
	    printf("mask = %s\n",mask);
	    if(!isValidMask(mask)){
	        	printf("invalid mask\n");
		        getchar();
	        	exit(0);
    	}
	    unsigned long netaddr = ntohl(inet_addr(ip));
	    unsigned long netmask = ntohl(inet_addr(mask));
    	unsigned long first_netaddr = netaddr & netmask;
    	unsigned long broadcast = netaddr | (~netmask);
	    long num = broadcast - first_netaddr - 1;
	    printf("Number of valid ips: %d\n",num);
    	for(unsigned long i = first_netaddr + 1; i < broadcast ; i++){

	    	    sockaddr_in addr;
	    	    addr.sin_addr.S_un.S_addr = ntohl(i);
	        	printf("%s\n",inet_ntoa(addr.sin_addr));
     }
     	return true;
}
int main(){
     	const char *ip = "192.168.0.55";
	     const char *mask = "255.255.255.0";
	     //char ip[32] = {0};
     	//char mask[32] = {0};
     	//scanf("%s %s",ip,mask);
     	calculateSubnet(ip,mask);
	     getchar();
     	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章