Chapter 03. 소켓 주소 구조체 다루기.

Slides:



Advertisements
Similar presentations
소켓 프로그래밍.  프로젝트 생성 ◦ Visual Studio 2008 ◦ Visual C# 2008 Express Edition ◦ 통합 개발 환경 (IDE)  서버 소켓  클라이언트 소켓  소켓 프로그램 실행  추적과 디버깅  소켓 클래스 메서드  소켓.
Advertisements

HANNAM Univ. 제 3 장 주소 체계와 데이터 정렬 Network Lab. Byoung-Son, Choi TCP/IP Socket Programming…
1 TCP/IP 소켓 프로그래밍 (C Version) 제 3 장 메시지 구성하기 김 도 형.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
제 11 장 구조체.
TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험]
13장 소켓.
Chapter 06. UDP 서버/클라이언트.
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
TCP/IP Socket Cover Slide 조태문.
TCP/IP 소켓 프로그래밍 - C 버전 중에서
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express.
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express.
네트워크 프로그래밍 Unix Network Programming, 2nd Ed., W. Richard Stevens, Prentice Hall PTR, 한국어 판 Unix Network Programming, Stevens 저, 김치하, 이재용 역, 대영사,
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
TCP/IP Socket Cover Slide 조태문.
Chapter 03. 소켓 주소 구조체 다루기.
Chapter 2 Socket Programming
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
컴퓨터 네트워크 PART 03 프로그래밍 (chapter 01 Socket 프로그래밍) 임효택
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Chapter 11. Raw 소켓.
Internet Address Conversion Functions
3장. 소켓 주소 구조체 다루기 소켓 주소 구조체의 정의와 초기화 방법을 익힌다.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
11 소켓 프로그래밍 기초.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
Department of Computer Engineering
Department of Computer Engineering
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
Socket Address Structure and Byte Ordering Functions
제 14 장 도메인 네임 시스템 정보통신연구실.
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Socket Address Structure and Byte Ordering Functions
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Internet Address Conversion Functions
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Department of Computer Engineering
Chapter 12. 직렬 통신과 무선 프로토콜.
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 - 도메인과 주소체계 -
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
5장. 상수와 기본 자료형. 5장. 상수와 기본 자료형 5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Internet Address Conversion Functions
School of Electronics and Information. Kyung Hee University.
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Chapter 16 Socket Interface.
Department of Computer Engineering
Department of Computer Engineering
인터넷 주소변환 School of Electronics and Information. Kyung Hee University.
C 프로그래밍 기초.
자바 5.0 프로그래밍.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
Department of Computer Engineering
Presentation transcript:

Chapter 03. 소켓 주소 구조체 다루기

소켓 주소 구조체의 용도와 초기화 방법을 익힌다. 바이트 정렬 함수의 필요성과 사용법을 익힌다. 학습 목표 소켓 주소 구조체의 용도와 초기화 방법을 익힌다. 바이트 정렬 함수의 필요성과 사용법을 익힌다. IP 주소 변환 함수를 익힌다. 도메인 이름 시스템의 동작 원리를 이해하고 이름 변환 함수를 익힌다.

소켓 주소 구조체(socket address structures) 소켓 주소 구조체 정의 (1/6) 소켓 주소 구조체(socket address structures) 네트워크 프로그램에서 필요로 하는 주소 정보를 담고 있는 구조체로, 다양한 소켓 함수의 인자로 사용 주소 체계에 따라 다양한 형태가 존재 예) TCP/IP  SOCKADDR_IN, IrDA  SOCKADDR_IRDA 기본형은 SOCKADDR 구조체임

SOCKADDR 구조체 sa_family sa_data 소켓 주소 구조체 정의 (2/6) struct sockaddr { 주소 체계를 나타내는 상수값 예) TCP/IP 프로토콜  AF_INET sa_data 해당 주소 체계에서 사용하는 주소 정보 예) TCP/IP 프로토콜  IP 주소와 포트 번호 struct sockaddr { u_short sa_family; char sa_data[14]; }; typedef struct sockaddr SOCKADDR;

SOCKADDR_IN 구조체 sin_addr 소켓 주소 구조체 정의 (3/6) struct sockaddr_in { short sin_family; // AF_INET u_short sin_port; // 포트 번호 struct in_addr sin_addr; // IP 주소 char sin_zero[8]; // 항상 0으로 채움 }; typedef struct sockaddr_in SOCKADDR_IN;

IN_ADDR 구조체 소켓 주소 구조체 정의 (4/6) struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; #define s_addr S_un.S_addr }; typedef struct in_addr IN_ADDR;

소켓 주소 구조체 비교 소켓 주소 구조체 정의 (5/6) SOCKADDR{} SOCKADDR_IN{} SOCKADDR_IRDA{} sa_family (2) sin_family (2) irdaAddressFamily (2) sa_data (14) sin_port (2) irdaDeviceID (4) sin_addr (4) irdaServiceName (25) sin_zero (8)

소켓 주소 구조체 사용 예 예1) 예2) 소켓 주소 구조체 정의 (6/6) SOCKADDR_IN addr1; // 소켓 주소 구조체를 초기화한다. ... f((SOCKADDR *)&addr1, ...); SOCKADDR_IN addr2; g((SOCKADDR *)&addr2, ...); // 소켓 주소 구조체를 사용한다. ...

바이트 정렬(byte ordering) 메모리에 데이터를 저장할 때의 바이트 순서 바이트 정렬 함수 (1/6) 빅 엔디안(big-endian), 리틀 엔디안(little-endian) 0x12 0x34 0x56 0x78 빅 엔디안 리틀 엔디안 0x1000 0x1001 0x1002 0x1003   

네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우 바이트 정렬 함수 (2/6) 네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우 종단 시스템 라우터 데이터 IP 주소 포트 번호 ? (a) (b) (c)

네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우(cont’d) 바이트 정렬 함수 (3/6) 네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우(cont’d) 프로토콜 구현을 위해 필요한 정보 (a) IP 주소  빅 엔디안 (b) 포트 번호  빅 엔디안 애플리케이션이 주고 받는 데이터 (c) 빅 엔디안 또는 리틀 엔디안으로 통일 참고  네트워크 바이트 정렬(network byte ordering) : 빅 엔디안 방식  호스트 바이트 정렬(host byte ordering) : 시스템이 사용하는 고유한 바이트 정렬 방식

바이트 정렬 함수(유닉스 호환) 바이트 정렬 함수(윈속 확장) 바이트 정렬 함수 (4/6) u_short htons (u_short hostshort); // host-to-network-short u_long htonl (u_long hostlong); // host-to-network-long u_short ntohs (u_short netshort); // network-to-host-short u_long ntohl (u_long netlong); // network-to-host-long int WSAHtons (SOCKET s, u_short hostshort, u_short* lpnetshort); int WSAHtonl (SOCKET s, u_long hostlong, u_long* lpnetlong); int WSANtohs (SOCKET s, u_short netshort, u_short* lphostshort); int WSANtohl (SOCKET s, u_long netlong, u_long* lphostlong);

바이트 정렬 함수 사용 바이트 정렬 함수 (5/6) hton*( ) ntoh*( ) 소켓 함수에게 넘겨줄 데이터 애플리케이션이 사용 hton*( ) ntoh*( ) 소켓 함수가 결과로 전달 소켓 함수 소켓 함수

SOCKADDR_IN 구조체의 바이트 정렬 방식 바이트 정렬 함수 (6/6) SOCKADDR_IN 구조체의 바이트 정렬 방식 sin_family (2) sin_port sin_addr (4) sin_zero (8) SOCKADDR_IN{} 호스트 바이트 정렬 네트워크 바이트 정렬

IP 주소 변환 함수 (1/4) IP 주소 변환 예

IP 주소 변환 함수 문자열 형태로 IP 주소를 입력받아 32비트 숫자(네트워크 바이트 정렬)로 리턴 unsigned long inet_addr (const char* cp); char* inet_ntoa (struct in_addr in); // network-to-ascii

바이트 정렬 함수와 IP 주소 변환 함수 사용 예 ① 소켓 주소 구조체를 초기화한 후 소켓 함수에게 넘겨주는 경우(f( )는 소켓 함수를 나타냄) // 소켓 주소 구조체 초기화 SOCKADDR_IN addr; ZeroMemory(&addr, sizeof(addr)); // 0으로 초기화 addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("147.46.114.70"); addr.sin_port = htons(9010); // 소켓 함수 호출 f((SOCKADDR *)&addr, ...);

바이트 정렬 함수와 IP 주소 변환 함수 사용 예 ② 소켓 함수가 소켓 주소 구조체를 입력으로 받아 값을 채우면, 애플리케이션이 이를 출력 등의 목적으로 사용하는 경우(g( )는 소켓 함수를 나타냄) // 소켓 주소 구조체 선언 SOCKADDR_IN addr; // 소켓 함수 호출 g((SOCKADDR *)&addr, ...); // IP 주소와 포트 번호 출력 printf("IP 주소=%s, 포트 번호=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

도메인 이름(domain name) 도메인 이름  IP 주소 변환 예 IP 주소와 대응되는 (기억하기 쉬운) 이름 도메인 이름 시스템과 이름 변환 함수 (1/6) 도메인 이름(domain name) IP 주소와 대응되는 (기억하기 쉬운) 이름 도메인 이름  IP 주소 변환 예

도메인 이름  IP 주소 변환 함수 도메인 이름 시스템과 이름 변환 함수 (2/6) struct hostent* gethostbyname ( const char* name // 도메인 이름 ); /* IP 주소(네트워크 바이트 정렬)  도메인 이름 */ struct hostent* gethostbyaddr ( const char* addr, // 네트워크 바이트 정렬된 IP 주소 int len, // IP 주소의 길이(예: 4) int type // 주소 체계(예: AF_INET)

hostent 구조체 도메인 이름 시스템과 이름 변환 함수 (3/6) struct hostent { char * h_name; // official name of host char ** h_aliases; // alias list short h_addrtype; // host address type short h_length; // length of address char ** h_addr_list; // list of addresses #define h_addr h_addr_list[0] // address, for backward compatibility }; typedef struct hostent HOSTENT;

hostent 구조체 (cont’d) 도메인 이름 시스템과 이름 변환 함수 (4/6) AF_INET 4 공식 도메인 이름\0 별명 #1\0 별명 #2\0 NULL h_name h_aliases h_addrtype h_length h_addr_list HOSTENT{} IP 주소 #1 IP 주소 #2 IN_ADDR{} h_length = 4

사용자 정의 함수 ① 도메인 이름 시스템과 이름 변환 함수 (5/6) // 도메인 이름 -> IP 주소 BOOL GetIPAddr(char *name, IN_ADDR *addr) { HOSTENT *ptr = gethostbyname(name); if(ptr == NULL){ err_display("gethostbyname()"); return FALSE; } memcpy(addr, ptr->h_addr, ptr->h_length); return TRUE;

사용자 정의 함수 ② 도메인 이름 시스템과 이름 변환 함수 (6/6) // IP 주소 -> 도메인 이름 BOOL GetDomainName(IN_ADDR addr, char *name) { HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET); if(ptr == NULL){ err_display("gethostbyaddr()"); return FALSE; } strcpy(name, ptr->h_name); return TRUE;