TCPIP Socket Programming 3 Network Lab ByoungSon Choi
TCP/IP Socket Programming… 제 3장 주소 체계와 데이터 정렬 Network Lab. Byoung-Son, Choi bschoi@netwk. hannam. ac. kr HANNAM Univ.
TCP/IP Socket Programming… Network Lab. Internet Address q 4바이트 IP 주소 ■ 네트워크 주소(네트워크 ID) + 호스트 주소(호스트 ID) 네트워크 ID 호스트 ID [그림 3 -2] IP 주소 Routing(P. 68) HANNAM Univ. 4
TCP/IP Socket Programming… Network Lab. 포트란 무엇인가? q 잘 알려진 포트(Well-Known Port) 예약되어 있는 Port ■ 0 ~ 1023 ■ ▶ FTP : 21 ▶ Telnet : 23 ▶ HTTP : 80 chatting Client File 전송 FTP Client 211. 217. 204. 103 FTP Server 두 개의 포트를 이용한 통신 예 HANNAM Univ. 6
TCP/IP Socket Programming… Network Lab. 주소 정보의 표현 q IPv 4의 주소체계를 나타내는 구조체 ■ sockaddr_in struct sockaddr_in { sa_family_t uint 16_t struct in_addr char }; sin_family; /* 주소 체계(AF_INET) */ sin_port; /* port 정보 */ sin_addr; /* 32 비트 IP 주소정보 */ sin_zero[8]; /* 사용되지 않음 */ struct in_addr { uint 32_t }; s_addr; /* 32비트 IP 주소정보 */ 주의 : 모든 데이터는 네트워크 바이트 순서로 저장해야 한다. HANNAM Univ. 7
TCP/IP Socket Programming… Network Lab. 주소 정보의 표현 q POSIX(Portable Operating System Interface) 유닉스 계열의 운영체제 ■ 표준화한 데이터 타입 ■ Data type Description Header int 8_t uint 8 _t int 16_t uint 16 _t int 32_t uint 32 _t signed 8 -bit int unsigned 8 -bit int (unsigned char) signed 16 -bit int unsigned 16 -bit int (unsigned short) signed 32 -bit int unsigned 32 -bit int (unsigned long) <sys/type. h> sa_family_t socklen_t address family length of struct <sys/socket. h> [표 3 -1] 데이터 타입 (P. 71) HANNAM Univ. 8
TCP/IP Socket Programming… Network Lab. 네트워크 바이트 순서 q 데이터 표현 방식에 따른 문제점 0 x 34 0 x 12 Big-Endian Little-Endian 0 x 12 12 번지 0 x 12 0 x 34 13 번지 0 x 34 0 x 1234 0 x 3412 HANNAM Univ. 12
TCP/IP Socket Programming… Network Lab. 네트워크 바이트 순서 q 네트워크 바이트 순서(Network Byte Order) ■ Big-Endian 방식을 적용하기로 약속 Big-Endian 0 x 34 0 x 12 0 x 34 Little-Endian 0 x 12 12 번지 0 x 34 13 번지 0 x 1234 HANNAM Univ. 13
TCP/IP Socket Programming… Network Lab. 네트워크 바이트 순서 q 바이트 순서 변환(Endian Conversion) unsigned short htons(unsigned short); /*Port 정보의 바이트 순서 변경*/ unsigned short ntohs(unsigned short); /*Port 정보의 바이트 순서 변경*/ unsigend long htonl(unsigned long); /*IP 주소의 바이트 순서 변경*/ unsigned long ntohl(unsigned long); /*IP 주소의 바이트 순서 변경*/ ‘h’ : host byte order ‘s’ : short (16 bit) ‘n’ : network byte order ‘l’ : long (32 bit) HANNAM Univ. 14
TCP/IP Socket Programming… Network Lab. 네트워크 바이트 순서 q endian_conv. c 소스 코드 실행 결과 HANNAM Univ. 15
TCP/IP Socket Programming… Network Lab. 인터넷 주소 조작하기 q inet_addr 함수 ■ Dotted-Decimal Notation을 Big-Endian 32 비트 정수형 데이터로 표현(네트워크 바이트 순서) unsigned long inet_addr(const char * string) 소스 코드 성공시 : Big_Endian 32비트 값 실패시 : INNADDR_NONE 실행 결과 HANNAM Univ. 16
TCP/IP Socket Programming… Network Lab. 인터넷 주소 조작하기 q inet_aton 함수 ■ Big-Endian 32비트 정수형 데이터(네트워크 바이트 순서)를 Dotted-Decimal Notation로 표현 char * inet_ntoa(struct in_addr) 소스 코드 성공시 : 변환된 해당 문자의 포인터 실패시 : -1 실행 결과 HANNAM Univ. 18
TCP/IP Socket Programming… Network Lab. 인터넷 주소 초기화 q 일반적인 형태 1: struct sockaddr_in addr; /*인터넷 주소 정보를 나타내는 구조체 변수 생성*/ 2: char *serv_ip="211. 217. 168. 13"; /*IP 선언*/ 3: char *serv_port="9190"; /*Prot 선언*/ 4: memset(&addr, 0, sizeof(addr_len)); /*인자로 전달된 구조체 변수 초기화*/ 5: addr. sin_family = AF_INET; 6: addr. sin_addr. s_addr = inet_addr(serv_ip); /*IP 주소를 설정*/ 7: addr. sin_port = htons(atoi(serv_port)); /*스트링을 정수값으로 변환후, /*프로토콜 체계 설정*/ 네트워크 바이트 순서로 변환*/ HANNAM Univ. 19
TCP/IP Socket Programming… Network Lab. 인터넷 주소 초기화 q 개선된 형태 1: struct sockaddr_in addr; 2: char *serv_port="9190"; 3: memset(&addr, 0, sizeof(addr_len)); 4: addr. sin_family = AF_INET; 5: addr. sin_addr. s_addr = htons(INADDR_ANY); 6: addr. sin_port = htons(atoi(serv_port)); /*현재 시스템의 IP를 자동적으로 찾아줌*/ 서버의 IP가 뭐더라? INADDR_ANY HANNAM Univ. 20
TCP/IP Socket Programming… Network Lab. 주소 정보 할당하기 q bind_sock 함수 소스 코드 실행 결과 HANNAM Univ. 22
TCP/IP Socket Programming… Network Lab. 윈도우 기반으로 구현하기 q endian_conv_win. c 소스 코드 실행 결과 HANNAM Univ. 24
TCP/IP Socket Programming… Network Lab. 윈도우 기반으로 구현하기 q inet_addr_win. c 소스 코드 실행 결과 HANNAM Univ. 25
TCP/IP Socket Programming… Network Lab. 윈도우 기반으로 구현하기 q bind_sock. c 소스 코드 실행 결과 HANNAM Univ. 26
TCP/IP Socket Programming… Network Lab. WSAString. To. Address & WSAAddress. To. String q 윈속 2에서 추가된 변환 함수 q 운영체제에 완전히 종속적 ■ 이 교재에서는 사용하지 않음 HANNAM Univ. 27
TCP/IP Socket Programming… Network Lab. WSAString. To. Address & WSAAddress. To. String q WSAAddress. To. String 함수 ■ 주소 정보 구조체 변수를 주소정보를 나타내는 문자열로 변환하 는 함수 #include <winsock 2. h> INT WSAAddress. To. String( LPSOCKADDR lpsa. Address, /*문자열로 변환할 주소 정보를 지니고 있는 구조체 변수의 포인터*/ DWORD dw. Address. Length, /*lpsa. Address 포인터가 가리키는 변수의 크기*/ LPWSAPROTOCOL_INFO lp. Protocol. Info, /*프로토콜 프로바이더(protocal provider)설정 일반적으로 NULL을 전달 */ LPTSTR lpsz. Address. String, /*문자열로 변경된 결과를 저장할 버퍼의 포인터*/ LPDWORD lpdw. Address. String. Length /*함수 호출시 lpsa. Address. String이 가리키는 버퍼의 크기를 전달하기 위해 사용, 함수 호출이 끝나면 전달된 포인터가 가리키는 변수에 저장된 문자열의 크기가 저장*/ ); HANNAM Univ. 29
TCP/IP Socket Programming… Network Lab. WSAString. To. Address & WSAAddress. To. String q 활용예제 소스 코드 실행 결과 HANNAM Univ. 30
TCP/IP Socket Programming… Network Lab. 참고문헌 q “데이터 통신과 네트워킹”, 이재광 외 2명, 교보 문고 q “TCP/IP 프로토콜”, 이재광외 5명, 미래컴 q “Linux Socket Programming by Example”, Warren W. Gay, QUE '00 HANNAM Univ. 31
TCP/IP Socket Programming… Network Lab. Q&A HANNAM Univ. 32
- Slides: 32