주소체계와 데이터 정렬

2009. 8. 5. 14:43언어/TCP-IP

Internet Address : 인터넷 상에 존재하는 호스트를 구분하기 위한 32비트 주소체계

네트워크 주소 = Network ID + Host ID

Network ID 1byte

A Class

0~127

Network ID 2byte

B Class

128~191

Network ID 3byte

C Class

192~223

클래스를 나누어 놓은 이유 : Network와 호스트의 크기를 구분하기 위해

네트워크와 네트워크를 연결 -> 게이트웨이(Router)

Port란? 호스트 내에서 실행되고 있는 프로세스를 구분 짓기 위해 16비트의 논리적 할당

논리적 할당 : 소프트웨어로 구현하다.

 

주소 정보의 표현.

IPv4의 주소 체계를 나타내는 구조체

struct sockaddr_in{

    sa_family_t        sin_family; // 주소체계(address family)

    uint16_t        sin_port; //port 정보

    struct in_addr         sin_addr; //32비트 IPv4 주소

    char            sin_zero[8]; // 사용하지 않음

 

struct in_addr{

    uint32_t        s_addr;

}

 

Data type

Description

Header

int8_t

uint8_t

int16_t

uint16_t

int32_t

uint32_t

signed 8-bit int

sinsigned 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/types.h>

sa_family_t

socklen_t

address family

length of struct

<sys/socket.h>

주의점 : 모든 데이터는 네트워크 바이트 순서로 저장 되어야 한다.

 

네트워크 바이트 순서

  1. Big-endian : highbyte부터
  2. Little-endian : lowbyte부터

네트워크 바이트 순서는 Big-endian방식만 사용하기로 약속되어있다.

예제1.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <winsock2.h>

#pragma comment (lib,"ws2_32.lib")

 

void ErrorHandling(char *message);

 

int main(int argc, char **argv)

{

    WSADATA        wsaData;

    short hostOrdPort = 0x1234;

    short netOrdPort;

 

    long hostOrdAdd = 0x12345678;

    long netOrdAdd;

 

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)

        ErrorHandling("WSAStartup() error!");

 

    netOrdPort=htons(hostOrdPort);

    netOrdAdd=htonl(hostOrdAdd);

 

    printf("Host ordered port : %x \n", hostOrdPort);

    printf("Network ordered port : %x \n\n", netOrdPort);

 

    printf("Host ordered Address : %x \n", hostOrdAdd);

    printf("Network ordered Address : %x \n\n", netOrdAdd);

 

    WSACleanup();

    return 0;

}

 

void ErrorHandling(char *message)

{

    fputs(message, stderr);

    fputc('\n', stderr);

    exit(1);

}

자신이 쓰고 있는 시스템이 Big-endian방식이라고 해도 반드시 변환 함수를 사용해서 네트워크 바이트 순서로 변환하는 과정을 거쳐야 한다.

그 이유는 이식성을 위해서다.

 

'언어 > TCP-IP' 카테고리의 다른 글

TCP 기반 서버/클라이언트  (0) 2009.08.06
소켓의 생성과 프로토콜의 설정  (0) 2009.08.05
네트워크 기초  (0) 2009.07.31