본문 바로가기
네트워크

iphdr 구조체와 in_addr 구조체

by 상레알 2010. 7. 8.

우선
(1) iphdr 구조체

/usr/include/linux/ip.h 에 정의되어 있다.  뭐 버전마다 다를수도 잇겟지만...-0-ㅋ

struct iphdr {
  unsigned char     ihl:4,                // 헤더 길이      // header length
  unsigned int       version:4;         // 버전              // version
  unsigned char     tos;               // 서비스 타입     // type of service
  unsigned short    tot_len;          // 전체 길이       // total length
  unsigned short    id;                 // identification
  unsigned short    frag_off;          // fragment offset field
  unsigned char     ttl;               //  time to live
  unsigned char     protocol;        // protocol
  unsigned short    check;            // check sum
  unsigned long     saddr;           // source  address
  unsigned long     daddr;           // dest address
  /*The options start here. */
};

아래는 ip 헤더의 그림이다...

0                      8 9                  15 16                                  31
-----------------------------------------------------------
|           | header|                      |                                     |
| version| length |  type of service|    total length                 |
-----------------------------------------------------------
|     identification                | flags |      fragment offset         |
-----------------------------------------------------------
| time to live    |    protocol  |          header checksum          |
-----------------------------------------------------------
|                            source Ip address                               |
----------------------------------------------------------- 
|                            destination IP address                         |
----------------------------------------------------------

즉 iphdr 구조체는 ip 헤더의 옵션을 정의한거 같다.

(2) in_addr 구조체

in_addr 구조체를 통해 바이트 집합, 한쌍의 16비트 워드, 하나의 32비트 워드로서 IP 어드레스에 접근할 수 있습니다.
이러한 유연성은 때론 코딩시 상당히 성가신 구문을 만들어 내기도 한다.

struct   in_addr {
        union {
                struct {
                      unsigned  char   s_b1,
                                              s_b2,
                                              s_b3,
                                              s_b4;
                }  S_un_b;
                struct {
                      unsigned  short  s_w1,
                                              s_w2;
                }  S_un_w;
                unsigned long  S_addr;
        } S_un;
};