본문 바로가기

Programming/JAVA

java C클래스 서브넷 계산기

import java.util.Scanner;

class subnet2
{
	static Scanner scan=new Scanner(System.in);
	static public void main(String[] args)
	{
		change ip = new change();
		
		while(true)		//메뉴 무한 루프
		{
			System.out.println("서브넷 계산기");
			System.out.println("1. IP주소, 호스트 갯수 입력");
			System.out.println("2. IP주소, 서브넷 마스크 입력");
			System.out.println("3. 종료");
			System.out.print("메뉴를 입력하시오.: ");
			int mode = scan.nextInt();
			if(mode==1)
				ip.host();
			else if(mode==2)
				ip.sub();
			else if(mode==3)
				break;
			else
				System.out.println("잘못 입력하였습니다");
		}
	}
}


class change // 모든 작업 하는 부분 ㅋㅋㅋ
{
	Scanner scan=new Scanner(System.in);
	int[] broad={0,0,0,0};		//브로드 캐스트 주소
	int[] ip_num=new int[4]; 	//ip 주소
	int[] sub_num=new int[4];	//서브넷 주소
	int[] network=new int[4];	//네트워크 주소
	
	void host()
	{
		while(true)
		{
			get_ip();
			System.out.println("호스트 갯수를 입력하시오");
			String host_String=scan.next();
			int host_int=Integer.parseInt(host_String);
			
			if(check_class(ip_num[0])=='C')
			{
				subnet(host_int);
				subnet_host(host_int);
				break;
			}
			else
				System.out.println(check_class(ip_num[0])+"클래스는 측정 불가능 합니다.");
		}
	}
	
	void sub()
	{
		while(true)	//무한 루프 - 단 모든 입력과 출력이 끝나면 break
		{
			get_ip();
			get_sub();			
			
			if(check_class(ip_num[0])=='C')
			{
				if(check_subnet())
				{
					System.out.println("입력하신 IP주소는 ");
					output_ip(ip_num);
					System.out.println("입니다.");
					
					System.out.println("입력하신 서브넷주소는 ");
					output_ip(sub_num);
					System.out.println("입니다.");
					
					for(int i=0;i<4;i++)				//입력받은 IP와 서브넷 마스크 AND
					{
						network[i]=ip_num[i] & sub_num[i];
					}	
					
					System.out.println("네트워크 주소는 ");
					output_ip(network);
					System.out.println("입니다.");
					
					broadcast();
					System.out.println("브로드 캐스트 주소는 ");
					output_ip(broad);
					System.out.println("입니다.");
					
					network[3]++;
					System.out.println("사용 가능한 주소 범위는 ");
					output_ip(network);
					System.out.println(" 부터 ");
					network[3]=--broad[3];
					output_ip(network);
					System.out.println(" 까지 입니다.");
					break;
				}
				else
				{
					System.out.println("해당 서브넷은 측정 불가 입니다.");
//					break;
				}
			}
			else
				System.out.println(check_class(ip_num[0])+"클래스는 측정 불가능 합니다.");
		}
	}
	
	void output_ip(int[] network) //xxx.xxx.xxx.xxx 형식으로 출력
	{
		for(int n=0;n<4;n++)
		{
			System.out.print(network[n]);
			if(n<3)
				System.out.print(".");
		}
		System.out.println();
	}
	void output_ip(String[] network) //오버로딩
	{
		for(int n=0;n<4;n++)
		{
			System.out.print(network[n]);
			if(n<3)
				System.out.print(".");
		}
		System.out.println();
	}

	void subnet(int host)
	{
		int host_1=host+2;
		int net_num=1;
		String addr="";
		String[] addr_1=new String[4];
		int[] addr_int=new int[4];
		
		while(host_1/2!=0) //네트워크 비트 수 확인
		{
			host_1=host_1/2;
			net_num++;
		}
//		System.out.println(net_num); //네트워크 비트 수 출력
		
		/*서브넷 마스크 설정*/
		for(int i=32;i>net_num;i--)
		{
			addr=addr+"1";
		}
		for(;net_num>0;net_num--)
		{
			addr=addr+"0";
		}
		
		for(int i=0;i<4;i++)
			addr_1[i]=addr.substring(8*i, 8*i+8);	//각각 4개로 나눠주기
		
		System.out.print("서브넷 마스크 2진수 값 ");
		output_ip(addr_1);		// 서브넷 마스크 2진수 출력
		
		for(int i=0;i<4;i++)
		{
			addr_int[i]=Integer.parseInt(addr_1[i]);
			for(int n=0,value=0,multiple=1; n<8; n++)	//2진수를 10진수로 변환
			{
				value =  addr_int[i]%10;
//				sub_int[i] = sub_int[i] + value*multiple;
				sub_num[i] = sub_num[i] + value*multiple;
				multiple = multiple * 2;
				addr_int[i] = addr_int[i]/10;
			}
		}		
	}
	
	void broadcast()
	{
		for(int i=0;i<3;i++)
			broad[i]=ip_num[i];
//		broad[3]=sub_int[3] ^ 255; //서브넷 주소와 255를 XOR
		broad[3]=network[3]+(sub_num[3]^255);  //네트워크 주소  + 서브넷 주소와 255 XOR
	}
	
/*	void broadcast_sub()
	{
		for(int i=0;i<3;i++)
			broad[i]=ip_num[i];
		broad[3]=network[3]+(sub_num[3]^255);    //네트워크 주소  + 서브넷 주소와 255 XOR
//		System.out.println("network[3] "+network[3]+" sub_int[3]^255 "+(sub_num[3]^255));
	}*/

	void get_ip()		//ip 입력 받기
	{
		while(true)	//입력받은 주소가 맞는지 확인
		{
			System.out.println("아이피 주소 입력");
			String a=scan.next();
			boolean[] test=new boolean[4];
			
			String[] ip_add={"","","",""};
			
			char[] arr=a.toCharArray();
			for(int i=0, j=0;i int
				ip_num[i]=Integer.parseInt(ip_add[i]);
			
//			output_ip(ip_num);			//ip주소 출력
			
			for(int i=0;i<4;i++)		//0~255까지 범위
				test[i]=(ip_num[i]<256)&&(ip_num[i]>=0);
				
			if(test[0]&&test[1]&&test[2]&&test[3])	//범위에 맞나?
				break;
			else
				System.out.println("잘못된 IP주소 입니다");
		}
	}
	
	void get_sub()	//서브넷 주소 받기
	{
		while(true)	//입력받은 주소가 맞는지 확인
		{
			System.out.println("서브넷 주소 입력");
			String a=scan.next();
			boolean[] test=new boolean[4];
			
			String[] sub_add={"","","",""};
			
			char[] arr=a.toCharArray();
			for(int i=0, j=0;i int
				sub_num[i]=Integer.parseInt(sub_add[i]);
			
			output_ip(sub_num);			//서브넷 주소 출력
			
			for(int i=0;i<4;i++)		//0~255까지 범위
				test[i]=(sub_num[i]<256)&&(sub_num[i]>=0);
				
			if(test[0]&&test[1]&&test[2]&&test[3])	//범위에 맞나?
				break;
			else
				System.out.println("잘못된 서브넷 주소 입니다");
		}
	}
	
	char check_class(int check)		//class 확인
	{
		char output;
		if(0<=check && check <=127)
			output='A';
		else if(128<=check && check<=191)
			output='B';
		else if(192<=check && check<=223)
			output='C';
		else
			output='?';
		
		return output;
	}
	
	boolean check_subnet()	//서브넷 마스크가 올바른지 확인
	{
		if(sub_num[0]==255 && sub_num[1]==255 && sub_num[2]==255 && sub_num[3]>=0)
			if(sub_num[3]==252 || sub_num[3]==248 || sub_num[3]==240 || sub_num[3]==224 
			|| sub_num[3]==192 || sub_num[3]==128 || sub_num[3]==0)
			{
				return true;
			}
			else
				return false;			
		else
			return false;
	}
	
	void subnet_host(int host_num)	//호스트 갯수를 입력 받으면 출력하는 부분
	{
		System.out.print("서브넷 마스크 10진수 값 ");
		output_ip(sub_num);		// 서브넷 마스크 10진수 출력
		System.out.print("브로드 캐스트 값 ");
		for(int i=0;i<4;i++)				//입력받은 IP와 서브넷 마스크 AND
		{
			network[i]=ip_num[i] & sub_num[i];
		}	
		broadcast();
		output_ip(broad);
		
//		int[] network=new int[4];
		
		/*for(int i=0;i<4;i++)				//입력받은 IP와 서브넷 마스크 AND
		{
			network[i]=ip_num[i] & sub_int[i];
		}	*/	
		System.out.print("네트워크 주소 ");
		output_ip(network);		//네트워크 주소 출력
		
		System.out.println("IP 범위");	//호스트 숫자 정하자
		network[3]++;
		output_ip(network);
		network[3]+=+host_num-1;
		System.out.println("부터");
		output_ip(network);
	}
}

'Programming > JAVA' 카테고리의 다른 글

[JAVA]키보드 입력 Scanner  (2) 2014.09.12
JAVA 랜덤 함수 Math.random()  (0) 2014.05.26
java 문자를 아스키로 변환  (0) 2014.05.19
JAVA 파일 입출력 예제  (0) 2014.05.19