티스토리 뷰

Network Programming

[TCP/IP]주소 체계와 데이터 정렬

군자동꽃미남 2016. 6. 24. 22:40

Port

: IP 주소 정보만을 가지고는 수신한 데이터 패킷을 메신저 프로그램에 전달할 것인지, 아니면 스트리밍 동영상 재생 프로그램에 전달해 줄 것인지 구분하지 못한다. 이를 구분하기 위한 것이 바로 Port이다. 32비트 IP주소로는 네트워크상에 존재하는 호스트를 구분하게 되고, 16비트 Port 정보로는 호스트 내에서 실행되고 있는 프로그램을 구분하게 된다. 이는 동일 호스트 내에서의 논리적인 할당일 뿐이다.


즉, 프로세서간 통신 또는 어떠한 프로세서에 데이터 패킷을 전달할 것인지에 결정하는데 사용된다.


TCP 소켓과 UDP소켓은 Port를 서로 공유하지 않으므로 중복되어도 상관 없다.


주소 정보 구조체

1
2
3
4
5
6
7
8
typedef struct sockaddr_in {
  ADDRESS_FAMILY sin_family;
  USHORT         sin_port;
  IN_ADDR        sin_addr;
  CHAR           sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;
 
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct in_addr {
  union {
    struct {
      UCHAR s_b1;
      UCHAR s_b2;
      UCHAR s_b3;
      UCHAR s_b4;
    } S_un_b;
    struct {
      USHORT s_w1;
      USHORT s_w2;
    } S_un_w;
    ULONG  S_addr; /* 32비트 IPv4 인터넷 주소 */
  } S_un;
} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
cs


  • sin_family 
    • 과거 BSD 소켓이 개발되던 과정에서 전문가들은 "앞으로 하나의 프로토콜 체계 안에서 여러 주소 체계가 사용될 수도 있을 것이다" 라고 예상하였다. 따라서 sin_family라는 이름의 멤버를 넣어 두었는데, 오늘날 프로토콜 체계 안에서 존재하는 주소 체계는 하나이기 때문에 프로토콜 체계에 따른 주소체계를 넣어주면 된다.
      • 프로토콜 체계를 나타내는 PF_INET과 주소 체계를 나타내는 AF_INET은 같은 상수값을 지니지만, 프로토콜 체계를 설정할 때는 PF_로, 주소 체계를 설정할때는 AF_로 사용하도록 하는게 좋은 습관이라고들 한다.

 주소 체계(Address Family)

 정의 

 AF_INET

 IPv4 인터넷 프로토콜

 AF_INET6

 IPv6 인터넷 프로토콜

 AC_LOCAL

 Local 통신을 위한 UNIX 프로토콜


  • sin_port
    • 16bit Port 정보를 NBO로 대입.
  • sin_addr
    • 32비트 IP주소 정보를 NBO로 대입.
  • sin_zero
    • 특별한 의미 없이 단순한 채워주기(padding) 목적으로 사용되는 구조체 멤버.
    1
    2
    3
    server_addr.sin_family    = AF_INET;
    server_addr.sin_port    = htons(1014);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    cs



    IP주소 조작 함수

    ==> "123.456.789.123" 처럼 점이 찍힌 십진수 표현 방식을 Dotted-Decimal Notation이라 한다.

    ==> Big-Endian == NBO(네트워크 바이트 순서)

    • inet_addr(const char* string)
      • 문자열로 된 Dotted-Decimal Notation를 넘겨주면 NBO 형식으로 변환 되어 리턴된다.
    • inet_ntoa(struct in_addr addr)
      • NBO로 된 32비트 값을 Dotted-Decimal Notation로 변환하여 리턴


    소켓에 주소 할당

    1
    2
    3
    4
    5
    int bind(
      _In_ SOCKET                s,
      _In_ const struct sockaddr *name,
      _In_ int                   namelen
    );
    cs

    소켓에 주소를 할당하는 방법은 bind() 함수를 사용하면 된다.

    sockaddr이 sockaddr_in이 아닌 이유는 bind() 함수는 범용적으로 사용 가능하게끔 선언되어 있기 때문이다. sockaddr_in뿐만 아니라 Local Unix 프로토콜을 위한 sockaddr_un 구조체의 포인터도 인자값으로 받을 수 있어야 하기 때문에 sockaddr이란 범용적으로 사용 가능한 구조체를 선언하고 인자 타입으로 지정해 준 것이다.



    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    «   2024/12   »
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31
    글 보관함