윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판 Chapter 03. 주소체계와 데이터 정렬
Chapter 03-1. 소켓에 할당되는 IP주소와 PORT번호 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
인터넷 주소(Internet Address) 인터넷 주소란? 인터넷상에서 컴퓨터를 구분하는 목적으로 사용되는 주소. 4바이트 주소체계인 IPv4와 16바이트 주소체계인 IPv6가 존재한다. 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다. 네트워크 주소와 호스트 주소로 나뉜다. 네트워크 주소를 이용해서 네트워크를 찾고, 호스트 주 소를 이용해서 호스트를 구분한다. 인터넷 주소의 역할 IPv4 인터넷 주소의 체계
클래스 별 네트워크 주소와 호스트 주소의 경계 달리 말하면... 때문에 첫 번째 바이트 정보만 참조해도 IP주소의 클래스 구분이 가능하며, 이로 인해서 네트워크 주소와 호스트 주소의 경계 구분이 가능하다.
소켓의 구분에 활용되는 PORT번호 PORT번호 PORT번호에 의한 소켓의 구분과정 IP는 컴퓨터를 구분하는 용도로 사용되며, PORT번호는 소켓을 구분하는 용도로 사용된다. 하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로, 둘 이상의 PORT가 하나 의 프로그램에 의해 할당될 수 있다. PORT번호는 16비트로 표현, 따라서 그 값은 0 이상 65535 이하 0~1023은 잘 알려진 PORT(Well-known PORT)라 해서 이미 용도가 결정되어 있다. PORT번호에 의한 소켓의 구분과정
윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판 Chapter 03-2. 주소정보의 표현 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
IP주소와 PORT번호는 구조체 sockaddr_in의 IPv4 기반의 주소표현을 위한 구조체 IP주소와 PORT번호는 구조체 sockaddr_in의 변수에 담아서 표현한다. 주소체계 PORT번호 32비트 IP주소 사용되지 않음 32비트 IPv4 인터넷 주소
구조체 sockaddr_in의 멤버에 대한 분석 멤버 sin_family 주소체계 정보 저장 멤버 sin_port 16비트 PORT번호 저장 네트워크 바이트 순서로 저장 멤버 sin_addr 32비트 IP주소정보 저장 멤버 sin_addr의 구조체 자료형 in_addr 사실상 32비트 정수자료형 멤버 sin_zero 특별한 의미를 지니지 않는 멤버 반드시 0으로 채워야 한다. 0으로 채워야 하는 멤버 sin_zero의 존재 이유를 이해할 필요가 있다!
구조체 sockaddr_in의 활용의 예 구조체 변수 sockaddr_in은 bind 함수의 인자로 전달되는데, 매개변수 형이 sockaddr이므로 형 변환을 해야만 한다. 구조체 sockaddr은 다양한 주소체계의 주소정보를 담을 수 있도록 정의되었다. 그래서 IPv4의 주소정보를 담기가 불편하다. 이에 동일한 바이트 열을 구성하는 구조체 sockaddr_in이 정의되었으며, 이를 이용해서 쉽게 IPv4의 주소정보를 담을 수 있다.
Chapter 03-3. 네트워크 바이트 순서와 인터넷 주소 변환 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
CPU에 따라 달라지는 정수의 표현 정수 1을 저장하는 두 가지 방법 : CPU가 적용하는....
바이트 순서(Order)와 네트워크 바이트 순서 데이터 송수신 과정에서의 문제 빅 엔디안(Big Endian) 상위 바이트의 값을 작은 번지수에 저장 리틀 엔디안(Little Endian) 상위 바이트의 값을 큰 번지수에 저장 호스트 바이트 순서 CPU별 데이터 저장방식을 의미함 네트워크 바이트 순서 통일된 데이터 송수신 기준을 의미함 빅 엔디안이 기준이다! 빅 엔디안 모델 리틀 엔디안 모델
바이트 순서의 변환 바이트 변환함수 htons에서 h는 호스트(host) 바이트 순서를 의미 n은 네트워크(network) 바이트 순서를 의미 s는 자료형 short를 의미 htonl에서 l은 자료형 long을 의미 이 기준을 적용하면 위 함수가 의미하는 바를 이해할 수 있다.
바이트 변환의 예 실행결과
Chapter 03-4. 인터넷 주소의 초기화와 할당 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
문자열 정보를 네트워크 바이트 순서의 정수로 변환 “211.214.107.99”와 같이 점이찍힌 10진수로 표현된 문자열을 전달하면, 해당 문자열 정보를 참조해서 IP주소정보를 32비트 정수형으로 반환! 실행결과
inet_aton 기능상으로 inet_addr 함수와 동일하다. 다만 in_addr형 구조체 변수에 변환의 결과가 저장된다는 점에서 차이를 보인다. 실행결과
inet_ntoa inet_aton 함수의 반대기능 제공! 네트워크 바이트 순서로 정렬된 정수형 IP주소정보를 우리가 눈으로 쉽게 인식할 수 있는 문자열의 형태로 변환. 실행결과
인터넷 주소의 초기화 “IP 211.217.168.13, PORT 9190으로 들어오는 데이터는 내게로 다 보내라!” 일반적인 인터넷 주소의 초기화 과정 서버에서 주소정보를 설정하는 이유! “IP 211.217.168.13, PORT 9190으로 들어오는 데이터는 내게로 다 보내라!” 클라이언트에서 주소정보를 설정하는 이유! “IP 211.217.168.13, PORT 9190으로 연결을 해라!”
INADDR_ANY 현재 실행중인 컴퓨터의 IP를 소켓에 부여할때 사용되는 것이 INADDR_ANY이다. 이는 서버 프로그램의 구현에 주로 사용된다.
Chapter 01의 예제 실행방식의 고찰 ./hserver 9190 ./hclient 127.0.0.1 9190 서버의 실행방식, 서버의 리스닝 소켓 주소는 INADDR_ANY로 지정을 하니, 소켓의 PORT번호만 인자를 통해 전달하면 된다. ./hserver 9190 ./hclient 127.0.0.1 9190 클라이언트의 실행방식, 연결할 서버의 IP와 PORT번호를 인자로 전달한다. 127.0.0.1은 루프백 주소라 하며, 이는 클라이언트를 실행하는 컴퓨터의 IP주소를 의미한다. 루프백 주소를 전달한 이유는, 서버와 클라이언트를 한 대의 컴퓨터에서 실행시켰기 때문이다.
소켓에 인터넷 주소 할당하기 서버프로그램에서의 일반적인 주소할당의 과정!
윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판 Chapter 03-5. 윈도우 기반으로 구현하기 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
함수 htons, htonl의 윈도우 기반 사용 예 실행결과
함수 inet_addr, inet_ntoa의 윈도우 기반 사용 예 실행결과
윈도우에서의 소켓 주소할당 리눅스에서의 소켓 주소할당과 차이가 없다.
WSAStringToAddress 주소정보를 나타내는 문자열을 가지고, 주소정보 구조체 변수를 적절히 채워 넣을 때 호출하는 함수 IPv6 기반에서도 사용이 가능! 단, 이 함수를 사용하면, 윈도우에 의존적인 코드가 구성 됨
WSAAddressToString WSAStringToAddress 함수와 반대의 기능을 제공
WSAStringToAddress & WSAAddressToString 의 사용 예 실행결과
Chapter 03이 끝났습니다. 질문 있으신지요?