본문 바로가기

소켓 프로그래밍/서버와 클라이언트

* 주소 체계와 데이터 설정

IP주소

인터넷상에 존재하는 호스트들을 구분하기 위한 32비트의 주소 체계를 의미한다.
일반적으로 점이 찍힌 십진수 표현 방식으로 IP주소를 표현하는데  점에 의해 구분 되는 각각의 십진수 값은 1바이트로 표현이 되며 총 4바이트를 사용하게 된다. IP주소는 인터넷에 연결되어 있는 컴퓨터를 구분하기 위해 사용된다.
ex) "212.421.222.123"

Port

IP주소로는 인터넷에 연결되어 있는 컴퓨터를 구분할 수 있지만 컴퓨터 안에서 실행되고 있는 프로그램까지는 구분하여 줄 수 없다. 그렇기 때문에 어떠한 프로그램에게 전달하여야하는지 필요로 하는 정보가 있는데 이때 사용되는 것이 Port이다. Port는 2바이트로 표현이 되는데 0에서 65535까지의 범위의 값으로 사용이 된다. 하지만 0부터 1023번까지는 잘 알려진 Port(well-known ports)라고 하여 예약된 번호이기 때문에 사용이 제한된다. 또한 Port는 중복될 수 없으나 TCP 소켓과 UDP 소켓은 Port를 서로 공유하지 않으므로 중복되어도 상관 없다. 결론적으로 데이터 전송의 최종 목적지는 호스트 컴퓨터가 아닌 메모리 상에 올라와있는 프로그램까지 전달이 되어야하므로 Port의 정보도 포함시켜야 한다.

주소 정보의 표현

1) IPv4의 주소 체계를 나타내는 구조체
struct sockaddr_in
{
    ADDRESS_FAMILY sin_family;       // 주소 체계
    USHORT sin_port;                         // 16비트 TCP / UDP port
    IN_ADDR sin_addr;                        // 32비트 IPv4 주소
    CHAR sin_zero[8];                         // 사용되지 않음
} SOCKADDR_IN, *PSOCKADDR_IN;

struct in_addr
{
    ULONG S_addr;                            // 32비트 IPv4 주소
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

sin_family는 IPv4 인터넷 프로토콜을 사용하고 있으므로 AF_INET 채워준다. 디파인으로 정의되어 있으며 상수 2라는 값을 사용한다. 프로토콜 체계를 나타내는 PF_INET과 상수 값이 동일하지만 직관성을 위해 AF_INET을 사용하는 것이 바람직하다.

sin_family의 주소체계 종류

sin_port는 네트워크 바이트 순서로 16비트 port번호로 채워준다. 

sin_addr는 32비트 IPv4의 주소로 채워넣어준다.

sin_zero는 구조체의 크기를 맞춰주기 위한(padding) 목적으로 사용되기 위한 변수이다.

 

* 바이트 순서
https://developer-jun.tistory.com/14

'소켓 프로그래밍 > 서버와 클라이언트' 카테고리의 다른 글

* Iterative 서버  (0) 2020.07.14
* TCP / IP 4계층  (0) 2020.07.13
* 바이트 순서  (0) 2020.07.09
* 소켓의 생성과 프로토콜  (0) 2020.07.08
1) Hello World 서버  (1) 2020.07.08