한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

Slides:



Advertisements
Similar presentations
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
Advertisements

HANNAM Univ. 제 3 장 주소 체계와 데이터 정렬 Network Lab. Byoung-Son, Choi TCP/IP Socket Programming…
Part TCP / IP(계속) 3. IP 주소 4. IP 라우팅 5. 응용 프로토콜.
2장. TCP/IP, 서브넷팅 2012년 2학기 중부대학교 정보보호학과 이병천 교수.
한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
13장 소켓.
Network Lab. Young-Chul Hwang
TCP/IP 소켓 프로그래밍 - C 버전 중에서
제 9 장 구조체와 공용체.
Chapter 2. IP Address IP Address의 구성에 대한 자세한 설명과 함께 IP Address를 효율적으로 관리하기 위한 방법인 서브넷팅, 수퍼넷팅, VLSM 등에 대해서 단계별로 접근할 수 있다. 몇가지 예제를 통해서 서브넷팅에 대한 개념을 정리하고.
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
24 장 TCP/IP 24.1 개요 24.2 네트워크층 24.3 주소 지정 24.4 서브넷팅틍
Linux에서의 IP, Port, 네트워크 바이트 순서, 주소 변환 주소 할당 등…
Chapter 03. 소켓 주소 구조체 다루기.
자료 구조: Chapter 3 (2)구조체, 포인터
Network Lab. Seoung Hyeon, Lee
컴퓨터 네트워크 PART 03 프로그래밍 (chapter 01 Socket 프로그래밍) 임효택
Internet Address Conversion Functions
3장. 소켓 주소 구조체 다루기 소켓 주소 구조체의 정의와 초기화 방법을 익힌다.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
제 14장 Multicast & Broadcast
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Department of Computer Engineering
Socket Address Structure and Byte Ordering Functions
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Socket Address Structure and Byte Ordering Functions
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Internet Address Conversion Functions
Chapter 06. UDP 서버/클라이언트.
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
Chapter 03. 소켓 주소 구조체 다루기.
Socket Address Structure and Byte Ordering Functions
Internet Address Conversion Functions
Socket Address Structure and Byte Ordering Functions
UDP Test 프로그램 분석.
Linux Socket Programming - 도메인과 주소체계 -
C#.
2장. TCP/IP, 서브넷팅 2012년 2학기 중부대학교 정보보호학과 이병천 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Internet Address Conversion Functions
School of Electronics and Information. Kyung Hee University.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
08장 쿠키와 세션.
TCP/IP 인터네트워킹 INTERNETWORKING with TCP/IP <vol
Department of Computer Engineering
Network 네트워크 이론 및 실습 TCP / IP 4장.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
인터넷 주소변환 School of Electronics and Information. Kyung Hee University.
CHAP 21. 전화, SMS, 주소록.
제 6 장 함수(functions).
라우터의 이해 (보충자료) TCP/IP구성 Ping명령어를 이용한 연결검사 비트와 바이트 10진수/2진수/16진수
Chapter 04. TCP 서버/클라이언트.
Chapter 02. 윈도우 소켓 시작하기.
구조체(struct)와 공용체(union)
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
Chapter 03. 소켓 주소 구조체 다루기.
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실 주소 변환 함수 Network Lab. 김 성 준 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

목 차 인터넷 IP 주소 인터넷 주소 클래스 Netmask의 이해 IP 주소 할당 사설 IP 주소 예약된 IP 주소

인터넷 IP 주소 보통 점으로 구분된 네 개의 10진수로 구성 4바이트로 구성 10진 표기법

인터넷 주소 클래스 인터넷 주소의 구성 네트워크 주소(Netid) 호스트 주소(Hostid) 호스트가 연결되어 있는 네트워크 확인 호스트 주소(Hostid) 네트워크의 호스트 중에 하나의 특정 호스트 확인 Netid Hostid Class type

인터넷 주소 클래스 인터넷 주소 클래스

인터넷 주소 클래스(계속) 인터넷 주소 클래스 클래스 최소 최대 네트워크 비트 호스트 비트 A 0.0.0.0 127.255.255.255 7 24 B 128.0.0.0 191.255.255.255 14 16 C 192.0.0.0 223.255.255.255 21 8 D 224.0.0.0 239.255.255.255 28 N/A E 240.0.0.0 247.255.255.255 27

인터넷 주소 클래스(계속) 10진 표기법을 이용한 클래스

Netmask의 이해 Mask 141.14.0.0 141.14.2.21 IP 주소 IP 주소 Netmask (Mask) 255.255.0.0 141.14.2.21 141.14.0.0 IP 주소 IP 주소

Netmask의 이해 (계속) netmask를 적용하여 네트워크 주소 산출

Netmask의 이해 (계속) A, B, C 클래스 주소를 위한 Netmask 클래스 최소 최대 Netmask A 0.0.0.0 127.255.255.255 255.0.0.0 B 128.0.0.0 191.255.255.255 255.255.0.0 C 192.0.0.0 223.255.255.255 255.255.255.0

Netmask의 이해 (계속) 예제 3.1 (netmask.c) 예제 IP 초기화 address[] adr_inet 초기화 최상위 바이트 검사 결과 출력

Netmask의 이해 (계속) 참고 사항 sockaddr_in 구조체 in_addr 구조체 Address Family struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; } in_addr 구조체 struct in_addr { u_long s_addr; Address Family #define AF_UNSPEC PF_UNSPEC #define AF_LOCAL PF_LOCAL #define AF_UNIX PF_UNIX #define AF_INET PF_INET Protocol Family #define PF_UNSPEC 0 /* Unspecified. */ #define PF_LOCAL 1 /* Local to host */ #define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */ #define PF_INET 2 /* IP protocol family. */

Netmask의 이해 (계속) 초기화 각종 변수 및 초기값 설정 int x; /* Index variable */ struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ unsigned msb; /* Most significant byte */ char class; char *netmask; static struct { unsigned char ip[4]; } addresses[] = { { { 44,135,86,12 } }, { { 127,0,0,1 } }, { { 172,16,23,95 } }, { { 192,168,9,1 } } };

Netmask의 이해 (계속) adr_inet 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 번호 설정 memcpy(&adr_inet.sin_addr.s_addr, addresses[x].ip,4); // addresses[x] -> adr_inet.sin_addr.s_addr 로 복사 len_inet = sizeof adr_inet; // 길이 정보 저장 ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환

Netmask의 이해 (계속) 최상위 바이트 검사 0x80 = 1000 0xC0 = 1100 0xE0 = 1110 0xF0 = 1111 최상위 바이트 검사 msb = *(unsigned char *) adr_inet.sin_addr.s_addr; // 주소 추출 // 최상위 바이트 검사 if ( (msb & 0x80) == 0x00 ) { // 1비트만 검사 class = 'A'; netmask = "255.0.0.0"; // 0000 A 클래스 } else if ( (msb & 0xC0) == 0x80 ) { // 2비트만 검사 class = 'B'; netmask = "255.255.0.0"; // 1000 B 클래스 } else if ( (msb & 0xE0) == 0xC0 ) { // 3비트만 검사 class = 'C';netmask = "255.255.255.0"; // 1100 C 클래스 } else if ( (msb & 0xF0) == 0xE0 ) { // 4비트만 검사 class = 'D';netmask = "255.255.255.255"; // 1110 D 클래스 } else { class = 'E';netmask = "255.255.255.255"; // 1111 E 클래스 }

Netmask의 이해 (계속) 결과 출력 실행 결과 addresses[x].ip[0], addresses[x].ip[1], printf("Address %u.%u.%u.%u is class %c netmask %s\n", addresses[x].ip[0], addresses[x].ip[1], addresses[x].ip[2], addresses[x].ip[3], class, netmask); 실행 결과 [sjkim@alzza Chap03]$ ./netmask Address 44.135.86.12 is class A netmask 255.0.0.0 Address 127.0.0.1 is class A netmask 255.0.0.0 Address 172.16.23.95 is class B netmask 255.255.0.0 Address 192.168.9.1 is class C netmask 255.255.255.0

IP 주소 할당 3개의 클래스 (A, B, C) 클래스 신청 가능 Netid를 부여 받아 Hostid 발급 interNIC www.nic.org 한국(www.krnic.or.kr)

사설 IP 주소 보통 IP 주소는 InterNIC에 등록 RFC 1597 -> 사설 IP 할당 방법 기술 클래스 최소 최대 네트워크 마스크 A 10.0.0.0 10.255.255.255 255.0.0.0 B 172.16.0.0 172.31.255.255 255.255.0.0 C 192.168.0.0 192.168.255.255 255.255.255.0 사설 IP 주소 범위

예약된 IP 주소 특정 목적을 위해 미리 예약된 IP 주소 RFC 1166 – INTERNET NUMBERS AMPRNET(The Amateur Radio Internet) 클래스 최소 최대 네트워크 마스크 A 44.0.0.0 44.255.255.255 255.0.0.0

IP 주소 처리 문자열 <-> 숫자 변환 함수 제공 제공되는 함수들 프로그램 작성이 용이 inet_addr 함수 inet_aton 함수 inet_ntoa 함수 inet_network 함수 inet_lnaof함수 inet_netof 함수 inet_makeaddr 함수

IP 주소 처리 - inet_addr(3) 함수 unsigned long inet_addr(const char *string); string-> 32비트 IP 주소로 변환할 문자열 변환이 성공하면 올바른 IP 주소 반환 만약 실패 하면 INADDR_NONE 반환 errno에 어떠한 에러 코드도 설정하지 않음

IP 주소 처리 - inet_addr(3) 함수 (계속) 예제 3.3 inetaddr.c 초기화 소켓 생성 / 주소 설정 주소 바인드 소켓 주소 출력

IP 주소 처리 - inet_addr(3) 함수(계속) 초기화 int z; struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ int sck_inet; /* Socket */ 소켓 생성 sck_inet = socket(AF_INET,SOCK_STREAM,0);

IP 주소 처리 - inet_addr(3) 함수(계속) 주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 설정 adr_inet.sin_addr.s_addr = inet_addr("127.0.0.95"); // 주소 설정 주소 바인드 z = bind(sck_inet, (struct ockaddr*)&adr_inet, len_inet); 소켓 주소 출력 system("netstat -pa --tcp 2>/dev/null| grep inetaddr");

IP 주소 처리 - inet_addr(3) 함수(계속) 실행 결과 tcp 0 0 127.0.0.95:9000 *:* CLOSE 5381/inetaddr 에러 검출 함수 static void bail(const char *on_what) { fputs(on_what,stderr); // 문자열을 표준 에러로 출력 fputc('\n',stderr); // 표준 에러에 개행문자 출력 exit(1); // 프로그램 종료 }

IP 주소 처리 - inet_aton(3) 함수 IP 주소 문자열을 32비트 IP 주소로 변환 int inet_aton(const char *string, struct in_addr *addr); string-> IP주소의 문자열 addr -> 변환된 IP 주소로 갱신된 구조체 실패하면 0이 반환 errno에 에러 코드 설정 하지 않음. 성공하면 addr에 올바른 IP 주소 설정

IP 주소 처리 - inet_aton(3) 함수 (계속) 예제 3.4 inetaton.c 초기화 소켓 생성 / 주소 설정 주소 바인드 소켓 주소 출력

IP 주소 처리 - inet_aton(3) 함수 (계속) 초기화 int z; struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ int sck_inet; /* Socket */ 소켓 생성 sck_inet = socket(AF_INET,SOCK_STREAM,0);

IP 주소 처리 - inet_aton(3) 함수 (계속) 주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트 설정 // 주소 변환 실패하면 bail 함수 호출 if ( !inet_aton("127.0.0.23", &adr_inet.sin_addr) ) bail("bad address."); len_inet = sizeof adr_inet; // 길이 설정

IP 주소 처리 - inet_aton(3) 함수 (계속) 주소 바인드 z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet); 소켓 주소 출력 system("netstat -pa --tcp 2>/dev/null| grep inetaton"); 실행결과 tcp 0 0 127.0.0.23:9000 *:* CLOSE 5949/inetaton

IP 주소 처리 - inet_ntoa(3) 함수 char *inet_ntoa(struct in_addr addr); addr -> 변환할 IP 주소를 저장하고 있는 구조체 성공하면 문자열 IP 주소의 포인터가 반환 내부 변수에 결과를 저장하기 때문에 다음에 호출 되기 전까지만 유효한 결과를 가진다.

IP 주소 처리 - inet_ntoa(3) 함수(계속) 예제 3.5 inetntoa.c 초기화 주소 설정 함수 호출 후 결과 출력

IP 주소 처리 - inet_ntoa(3) 함수(계속) 초기화 struct sockaddr_in adr_inet; /* AF_INET */ int len_inet; /* length */ 주소 설정 memset(&adr_inet,0,sizeof adr_inet); // 구조체 초기화 adr_inet.sin_family = AF_INET; // Domain 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정 // 주소 설정 “127.0.0.23” -> adr_inet.sin_addr if ( !inet_aton("127.0.0.23",&adr_inet.sin_addr)) puts("bad address.");

IP 주소 처리 - inet_ntoa(3) 함수(계속) 함수 호출 및 결과 출력 printf("The IP Address is %s\n",inet_ntoa(adr_inet.sin_addr)) 실행 결과 The IP Address is 127.0.0.23

IP 주소 처리 - inet_network(3) 함수 마스크 값을 호스트 비트 혹은 네트워크 비트에 적용 할 때 사용 unsigned long inet_network(const char *addr); addr -> 10진 IP주소를 포함하는 문자열 반환값은 호스트 순서 32비트 IP 주소 실패시 0xFFFFFFFF(모두 1)

IP 주소 처리 - inet_network(3) 함수(계속) net_addr = inet_network("192.168.9.1") & 0xFFFFFF00; 결과 => 0xC0A80900 (10진수 192.168.9.0) 192.168.9.1을 16진수로 변환 -> C0 A8 09 01 C0 A8 09 01 & FF FF FF 00 = C0 A8 09 00

IP 주소 처리 - inet_network(3) 함수(계속) 예제 3.6 network.c 초기화 함수 호출 후 결과 출력

IP 주소 처리 - inet_network(3) 함수(계속) 초기화 int x; const char *addr[] = {"44.135.86.12", "127.0.0.1", "172.16.23.95", “192.168.9.1"}; unsigned long net_addr; 함수 호출 후 결과 출력 net_addr = inet_network(addr[x]); printf("%14s = 0x%08lX net 0x%08lX\n", addr[x],net_addr, (unsigned long)htonl(net_addr)) ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환

IP 주소 처리 - inet_network(3) 함수(계속) 실행 결과 44.135.86.12 = 0x2C87560C net 0x0C56872C 127.0.0.1 = 0x7F000001 net 0x0100007F 172.16.23.95 = 0xAC10175F net 0x5F1710AC 192.168.9.1 = 0xC0A80901 net 0x0109A8C0 C0 09 192.168.9.1 = 0x C0 A8 09 01 net 0x 01 09 A8 C0 A8 01

IP 주소 처리 - inet_lnaof(3) 함수 IP 주소에서 네트워크 ID 부분을 제외한 호스트 ID 부분만을 반환 unsigned long inet_lnaof(struct in_addr addr); addr -> 네트워크 바이트 순서의 IP 주소 반환값 -> addr의 호스트 ID 부분

IP 주소 처리 - inet_lnaof(3) 함수 (계속) 클래스 16진수값 10진표기법 44.135.86.12 A 0087560C 0.135.86.12 127.0.0.1 00000001 0.0.0.1 172.16.23.95 B 0000175F 0.0.23.95 192.168.9.1 C 44.135.86.12 (10진수) 2C.87.56.0C (16진수)

IP 주소 처리 - inet_netof(3) 함수 Inet_lnaof(3) 함수와 유사 Host ID 대신 네트워크 ID 반환 unsigned long inet_netof(struct in_addr addr); addr -> 네트워크 바이트 순서의 IP 주소 반환값 -> addr의 네트워크 ID 부분

IP 주소 처리 - inet_netof(3) 함수 (계속) 클래스 16진수값 10진표기법 44.135.86.12 A 0000002C 0.0.0.44 127.0.0.1 0000007F 0.0.0.127 172.16.23.95 B 0000AC10 0.0.172.16 192.168.9.1 C 00C0A809 0.192.168.9 44.135.86.12 (10진수) 2C.87.56.0C (16진수)

IP 주소 처리 - inet_makeaddr(3) 함수 inet_lnaof(3) 함수와 inet_netof(3)함수가 에서 분리한 네트워크 iD와 호스트 ID를 다시 결합하여 원래의 IP 주소를 생성 struct in_addr inet_makeaddr(int net,int host); net -> inet_netof 함수에서 추출한 네트워크 ID host -> inet_lnaof 함수에서 추출한 호스트 ID 반환값 -> 원래의 IP 주소를 저장한 in_addr구조체

IP 주소 처리 - inet_makeaddr(3)함수(계속) 예제 3.7 makeaddr.c 초기화 소켓 생성 / 주소 설정 주소 분리(호스트 ID와 네트워크 ID) 및 출력 구조체 재초기화 재결합 및 출력

IP 주소 처리 - inet_makeaddr(3)함수(계속) 초기화 int x; // for문의 첨자 struct sockaddr_in adr_inet; /* AF_INET */ // 예제 IP 주소들 const char *addr[] = { "44.135.86.12", "127.0.0.1", "172.16.23.95", "192.168.9.1" }; // 네트워크 ID와 호스트 ID를 위한 변수 unsigned long net, hst;

IP 주소 처리 - inet_makeaddr(3)함수(계속) 소켓 생성 및 주소 생성 memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정 if ( !inet_aton(addr[x],&adr_inet.sin_addr) ) // 주소 생성 puts("bad address."); ※ htonl 함수 : 호스트 순서 주소를 네트워크 순서 주소로 변환 inet_aton : 문자열을 IP 주소로 변환

IP 주소 처리 - inet_makeaddr(3)함수(계속) 주소 분리 및 출력 // 호스트 ID 추출 hst = inet_lnaof(adr_inet.sin_addr); // 네트워크 ID 추출 net = inet_netof(adr_inet.sin_addr); // 추출 내용 출력 (기존의 IP, 네트워크 ID, 호스트 ID) printf("%14s : net=0x%08lX host=0x%08lX\n", inet_ntoa(adr_inet.sin_addr), net, hst);

IP 주소 처리 - inet_makeaddr(3)함수(계속) 구조체 재 초기화 재구성할 IP 주소를 보다 명확히 보여주기 위해서 memset(&adr_inet,0,sizeof adr_inet); // 메모리 초기화 adr_inet.sin_family = AF_INET; // 도메인 설정 adr_inet.sin_port = htons(9000); // 포트번호 설정

IP 주소 처리 - inet_makeaddr(3)함수(계속) 주소의 재결합 및 출력 재결합 adr_inet.sin_addr = inet_makeaddr(net,hst); 출력 printf("%14s : %s\n\n", "inet_makeaddr", inet_ntoa(adr_inet.sin_addr));

IP 주소 처리 - inet_makeaddr(3)함수(계속) 실행 결과 44.135.86.12 : net=0x0000002C host=0x0087560C inet_makeaddr : 44.135.86.12 127.0.0.1 : net=0x0000007F host=0x00000001 inet_makeaddr : 127.0.0.1 172.16.23.95 : net=0x0000AC10 host=0x0000175F inet_makeaddr : 172.16.23.95 192.168.9.1 : net=0x00C0A809 host=0x00000001 inet_makeaddr : 192.168.9.1 C0 A8 09 01 : C클래스 주소

요약 함 수 명 개요 문자열 IP 주소를 32비트 IP주소로 변환 32비트 IP주소를 문자열 IP 주소로 변환 inet_addr 함수 문자열 IP 주소를 32비트 IP주소로 변환 inet_aton 함수 inet_ntoa 함수 32비트 IP주소를 문자열 IP 주소로 변환 inet_network 함수 IP 주소를 호스트 순서 -> 네트워크 순서로 변환 inet_lnaof 함수 IP 주소에서 호스트 주소 부분 추출 inet_netof 함수 IP 주소에서 네트워크 주소 부분 추출 inet_makeaddr 함수 분리된 호스트 주소와 네트워크 주소를 결합