블로그 이미지
랜달프

calendar

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

Notice

    'Programming'에 해당되는 글 34

    1. 2008.04.06 winpcap/pcap.h 함수 분석
    2. 2008.04.06 각종 Header 정보
    3. 2007.12.04 파일열기 함수 fopen()의 모드
    4. 2007.12.03 달팽이 배열 알고리즘
    2008. 4. 6. 16:14 Programming/C programming
    winpcap/pcap.h 함수 분석
    1. typedef void(*  pcap_handler )(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) 
    [ 기능 ]
    패킷을 받는 콜백 함수의 프로토타입
    [ 파라미터 ]
    u_char *user : pcap_dispatch() pcap_loop()를 호출할 때 전달하는 u_char 포인터
    const struct pcap_pkthdr *pkt_header : 패킷의 정보를 기지고 있는 pcap_pkthdr 구조체
    const u_char *pkt_data : 패킷의 데이터를 가리키고 있는 u_char 포인터
     
    2. pcap_t *pcap_open_live (char *device, int snaplen, int promisc, int to_ms, char *ebuf)
    [ 기능 ]
    네트워크의 패킷들을 보기위해 필요한 packet capture descriptor를 얻기위해 사용된다.
    [ 파라미터 ]
    char *device : 사용할 네트워크 디바이스를 지시하는 스트링 
    int snaplen : 캡쳐할 최대 bytes 
    int promisc : NIC promiscuous mode로 동작할 지 여부 
    int to_ms : millisecond 단위의 read timeout 
    char *ebuf : pcap_open_live()가 실패할 경우에만 에러 메시지가 저장된다. 보통 NULL
    [ 반환 ]
    성공 : 패킷 캡쳐 descriptor
    실패 : NULL
     
    3. pcap_t * pcap_open_dead (int linktype, int snaplen)
    [ 기능 ]
    libpcap의 다른 함수를 호출할 때 pcap_t structure를 생성한다.
     
    4. pcap_t *pcap_open_offline(char *fname, char *ebuf)
    [ 기능 ]
    기존에 저장된 파일에서 패킷을 읽기 위해 사용된다. 
    stdin에서 읽기 위해서는 파일 이름을 "-"으로 한다. 
    [ 파라미터 ]
    char *fname : 오픈할 파일의 이름 
    char *ebuf : 실패할 경우 에러 메시지가 저장된다 .
    [ 리턴 ]
    성공 : descriptor
    실패 : NULL
     
    5. pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname) 
    [ 기능 ]
    캡쳐한 내용을 파일에 저장하기 위해서 파일을 오픈한다. 
    stdout을 지시하려면 파일이름을 "-"를 이용한다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor 
    char *fname : 오픈할 파일의 이름
    [ 리턴 ]
    성공 : pcap_dumper_t로 패킷 덤프와 관련된 구조체
    실패 : NULL
     
    6. int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf)
    [ 기능 ]
    블록킹과 논블록킹 모드를 바꾼다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor 
    int nonblock : non-zero 혹은 zero 값을 지닌다.
    char *errbuf : 실패시 에러 메시지가 채워진다.
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    7. int  pcap_getnonblock (pcap_t *p, char *errbuf) 
    [ 기능 ]
    인터페이스의 non-blocking 상태를 얻는다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor 
    char *errbuf : 실패시 에러 메시지가 채워진다.
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    8. int  pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf)
    [ 기능 ]
    pcap_open_live()로 열린 네트워크 디바이스의 리스트를 구한다.
    [ 파라미터 ]
    pcap_if_t **alldevsp : 네트워크 다비이스의 리스트 포인터
    char *errbuf : 실패시 에러 메시지가 채워진다.
    [ 반환 ]
    성공 : 0
    실패 : -1
     
    9. void  pcap_freealldevs (pcap_if_t *alldevsp)
    [ 기능 ]
    pcap_findalldevs()에 의해 리턴된 인터페이스 리스트를 해제한다.
    [ 파라미터 ]
    pcap_if_t **alldevsp : 네트워크 다비이스의 리스트 포인터
     
    10. char *  pcap_lookupdev (char *errbuf) 
    [ 기능 ]
    패킷을 캡쳐할 적당한 네트워크 디바이스(NIC : Network Interface Card)를 찾아
    그 디바이스를 지칭하는 스트링을 리턴한다. 
    네트워크 디바이스를 지칭하는 스트링은 각 운영체제 별로 표현되는 별명(alias) 
    말하며 Linux의 경우 "eth0", "eth1" 식으로 표현되고 BSD 계열은 각 네트워크 
    디바이스 벤더별로 별도로 명명된다.
    [ 파라미터 ]
    char *errbuf : 실패시 에러 메시지가 채워진다.
    [ 리턴 ]
    성공 : 네트워크 디바이스의 별명(alias)
    실패 : NULL
     
    11. int  pcap_lookupnet (char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf)
    [ 기능 ]
    네트워크 디바이스의 네트워크 주소와 netmask 정보를 가져오기위해 사용된다. 
    [ 파라미터 ]
    char *device : 네트워크 디바이스의 별명(alias) 
    bpf_u_int32 *netp : 네트워크 디바이스의 네트워크 주소가 저장될 주소 
    bpf_u_int32 *maskp : 네트워크 디바이스의 netmask가 저장될 주소 
    char *errbuf : 에러 발생시 에러 메시지 저장
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    12. int  pcap_dispatch (pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    [ 기능 ]
    프로세스 패킷을 구성할 때 사용된다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor 
    int cnt : 읽을 패킷의 갯수
    pcap_handler callback : 패킷을 처리할 루틴
    u_char *user : 패킷 데이타 포인터
    [ 리턴 ]
    성공 : 읽은 패킷의 수
    실패 : -1
     
    13. int  pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    [ 기능 ]
    패킷의 그룹을 모은다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor 
    int cnt : 읽을 패킷의 갯수
    pcap_handler callback : 패킷을 처리할 루틴
    u_char *user : 패킷 데이타 포인터
    [ 리턴 ]
    성공 : 읽은 패킷의 수
    실패 : -1
     
    14 void  pcap_dump (u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
    [ 기능 ]
    pcap_dump_open()을 통해 저장할 파일을 결정했다면 이 함수로 실제 저장이 이루어진다. 
    callback 루틴을 호출할 때와 같은 파라미터를 가진다.
    [ 파라미터 ]
    u_char *user : 사용자 데이터 
    struct pcap_pkthdr *h : 패킷의 정보를 가리키고 있는 포인터 
    u_char *sp : 패킷의 데이터를 가리키고 있는 u_char 포인터
     
    15. int  pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
    [ 기능 ]
    스트링 형태의 필터링 룰을 해석해 bpf_program 구조체에 저장한다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    struct bpf_program *fp : 필터링 룰에 따라 결정될 구조체 
    char *str : 스트링 형태의 필터링 룰 
    int optimize : 결과 코드를 수행할 때 최적화 여부 
    bpf_u_int32 netmask : 네트워크의 mask
     
    16. int  pcap_compile_nopcap (int snaplen_arg, int linktype_arg, struct bpf_program *program, char *buf, int optimize, bpf_u_int32 mask)
    [ 기능 ]
    어댑터를 열지 않고 패킷 필터를 컴파일한다.
    커널레벨의 필터링룰에 의해 인터프리트될 수 있는 프로그램에서
    높은레벨의 필터링표현을 변환한다.
    [ 파라미터 ]
    int snaplen_arg : 
    int linktype_arg :
    struct bpf_program *program : 필터링 룰에 따라 결정될 구조체
    char *buf : 스트링 형태의 필터링 룰
    int optimize : 결과 코드를 수행할 때 최적화를 물어본다
    bpf_u_int32 mask : mask
    [ 리턴 ]
    성공 :
    실패 : -1
     
    17. int  pcap_setfilter (pcap_t *p, struct bpf_program *fp)
    [ 기능 ]
    pcap_compile()을 통해 결정된 bpf_program 구조체를 적용할 때 사용된다. 
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    struct bpf_program *fp : 보통 pcap_compile()에서 결과 
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    18. void  pcap_freecode (struct bpf_program *fp)
    [ 기능 ]
    필터를 해제한다.
    [ 파라미터 ]
    struct bpf_program *fp : 보통 pcap_compile()에서 결과
     
    19. u_char *  pcap_next (pcap_t *p, struct pcap_pkthdr *h)
    [ 기능 ]
    다음 패킷의 포인터를 리턴한다. 내부적으로 pcap_dispatch()를 호출한다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    struct pcap_pkthdr *h : 패킷의 정보를 가리키고 있는 포인터
    [ 리턴 ]
    성공 : 패킷을 가리키는 포인터
    실패 : NULL
     
    20. int  pcap_datalink (pcap_t *p)
    [ 기능 ]
    link type을 리턴한다.
    pcap_t의 멤버 중 linktype.
    linke type bpf.h에 정의되어 있다. 
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : link type
     
    21. int  pcap_snapshot (pcap_t *p)
    [ 기능 ]
    pcap_open_live()가 호출될 때 지정된 길이인 snapshot length를 리턴한다.
    pcap_t의 멤버 중 snapshot
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor
    [ 리턴 ]
    성공 : snapshot length
    실패 :
     
    22. int  pcap_is_swapped (pcap_t *p)
    [ 기능 ]
    사용하고 있는 저장 파일과 사용하는 시스템이 같은 byte order를 사용하는지 여부를
    알 수 있다. 
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    0 : 같은 byte order를 사용할 경우 
    1 : 다른 byte order를 사용할 경우
     
    23. int pcap_major_version(pcap_t *p)
    [ 기능 ]
    저장 파일에 사용된 pcap의 메이저 버전을 리턴한다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : pcap의 메이저 버전
     
    24. int pcap_minor_version(pcap_t *p)
    [ 기능 ]
    저장 파일에 사용된 pcap의 마이너 버전을 리턴한다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : pcap의 마이너 버전
     
    25. int pcap_stats(pcap_t *p, struct pcap_stat *ps) 
    [ 기능 ]
    패킷 캡쳐에 관한 상태 정보를 ps에 저장한다. 송수신된 패킷의 갯수나 에러 발생 정보 등의 통계 정보를 알 수 있다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    struct pcap_stat *ps : 패킷 캡쳐 상태 정보 구조체
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    26. FILE *pcap_file(pcap_t *p) 
    [ 기능 ]
    p가 가리키는 패킷 캡쳐에서 사용하는 저장 파일의 FILE 포인터를 넘겨준다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : 파일 포인터
     
    27. int pcap_fileno(pcap_t *p) 
    [ 기능 ]
    p가 가리키는 패킷 캡쳐에서 사용하는 저장 파일의 descriptor를 넘겨준다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : file descriptor
     
     
    28. void pcap_perror(pcap_t *p, char *prefix) 
    [ 기능 ]
    최근에 발생한 에러에 대해 에러메시지를 stderr에 출력한다.
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    char *prefix : 메시지를 출력할 때 앞에 추가할 내용 
     
    29. char *pcap_geterr(pcap_t *p) 
    [ 기능 ]
    최근에 발생한 에러에 대한 메시지를 리턴한다. 
    [ 파라미터 ]
    pcap_t *p : 패킷 캡쳐 descriptor 
    [ 리턴 ]
    성공 : 최근 발생한 에러 메시지
     
    30. char *pcap_strerror(int error)
    [ 기능 ] 
    strerror(1)이 없을 경우를 위해 제공된다.
    [ 파라미터 ] 
    int error : error number 
    [ 리턴 ]
    성공 : error 메시지
     
    31. void  pcap_close (pcap_t *p)
    [ 기능 ]
    패킷을 닫고 메모리 해제
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
     
    32. void pcap_dump_close(pcap_dumper_t *p)
    [ 기능 ]
    저장 파일을 닫는다.
    [ 파라미터 ]
    pcap_dumper_t *p : 패킷 덤프 descriptor
     
    33. int  pcap_setbuff (pcap_t *p, int dim)
    [ 기능 ]
    어댑터와 연결된 커널 버퍼의 크기를 지정한다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
    int dim : 버퍼의 사이즈
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    34. int  pcap_setmode (pcap_t *p, int mode)
    [ 기능 ]
    인터페이스 p의 모드를 지정한다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
    int mode : 모드(MODE_CAPT : 기본캡춰모드, MODE_STAT : 통계모드)
     
    35. int  pcap_sendpacket (pcap_t *p, u_char *buf, int size) 
    [ 기능 ]
    로우 패킷을 보낸다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
    u_char *buf : 보내어진 패킷의 데이터
    int size : 버퍼 크기
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    36. int  pcap_setmintocopy (pcap_t *p, int size)
    [ 기능 ]
    싱글 호출에서 커널에 의해 받아진 데이터의 최소 크기를 지정한다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
    int size : 사이즈
    [ 리턴 ]
    성공 : 0
    실패 : -1
     
    37. HANDLE  pcap_getevent (pcap_t *p)
    [ 기능 ]
    인터페이스 p와 연결된 이벤트의 핸들을 구한다.
    [ 파라미터 ]
    pcap_t *p : pcap_open_offline()이나 pcap_open_live()에서 return되는 descriptor
    [ 리턴 ]
    성공 : 핸들
     
    pcap_send_queue *  pcap_sendqueue_alloc (u_int memsize)
    [ 기능 ]
    send queue를 할당한다.
    [ 파라미터 ]
    u_int memsize : 큐의 최소 사이즈
     
    38. void pcap_sendqueue_destroy  (  pcap_send_queue *queue  )   
    [ 기능 ]
    send queue를 해제한다.
    [ 파라미터 ]
    pcap_send_queue *queue : 큐 포인터
     
    39. int  pcap_sendqueue_queue (pcap_send_queue *queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
    [ 기능 ]
    send queue의 끝에 패킷을 추가한다.
    [ 파라미터 ]
    pcap_send_queue *queue :
    const struct pcap_pkthdr *pkt_header : 패킷의 헤더와 길이를 포함하는 pcap_pkthdr 자료구조의 포인터
    const u_char *pkt_data : 패킷의 데이터를 포함하는 버퍼의 포인터
     
    40. u_int  pcap_sendqueue_transmit (pcap_t *p, pcap_send_queue *queue, int sync)
    [ 기능 ]
    로우 패킷의 큐를 네트워크로 보낸다.
    [ 파라미터 ]
    pcap_t *p : 보내어진 패킷을 가진 어댑터의 포인터
    pcap_send_queue *queue : 보내기 위한 패킷을 포함하는 pcap_send_queue 자료구조의 포인터
    int sync : 동기화, 비동기화의 여부로 non-zero(TRUE)일 경우 동기화가 된다.
    [ 리턴 ]
    성공 : 실제 보내어진 바이트 수
     
    41. int  pcap_next_ex (pcap_t *p, struct pcap_pkthdr **pkt_header, u_char **pkt_data)
    [ 기능 ]
    오프라인 캡처로부터 혹은 인터페이스로부터 패킷을 읽는다.
    [ 파라미터 ]
    pcap_t *p : 보내어진 패킷을 가진 어댑터의 포인터
    struct pcap_pkthdr **pkt_header :
    u_char **pkt_data :
     
    [ 리턴 ]
    1 : 성공
    0 : timeout이 만기될 경우
    -1 : 에러 발생
    -2 : EOF
     
    42. int  pcap_live_dump (pcap_t *p, char *filename, int maxsize, int maxpacks) 
    [ 기능 ]
    인터페이스로부터 네트워크 트래픽 덤프를 파일로 저장한다.
    [ 파라미터 ]
    pcap_t *p : 어댑터의 포인터
    char *filename : 파일 이름
    int maxsize : 최대 사이즈
    int maxpacks : 최대 패킷
    [ 리턴 ]
    성공 : 1
    실패 : 0
     
    43. int  pcap_live_dump_ended (pcap_t *p, int sync)
    [ 기능 ]
    커널 덤프 프로세스의 상태를 구한다.
    [ 파라미터 ]
    pcap_t *p : 어댑터의 포인터
    int sync : nonzero면 덤프가 끝날때까지 함수는 블록킹 된다.
    [ 리턴 ]
    성공 : 1
    실패 : -1
     
    44. pcap_stat *  pcap_stats_ex (pcap_t *p, int *pcap_stat_size)
    [ 기능 ]
    현재 캡춰한 통계를 보여준다.
    [ 파라미터 ]
    pcap_t *p : 어댑터의 포인터
    int *pcap_stat_size : pcap_stat 자료구조의 사이트를 포함한다.
    [ 리턴 ]
    성공 : pcap_stat 포인터로 현재 디바이스의 통계를 저장
    실패 : NULL
     
    char* pcap_strerror  (  int    error  )   
    [ 기능 ]
    strerror()가 이용가능하지 않을때 제공된다.
    [ 파라미터 ]
    int error : 에러
    [ 리턴 ]
    성공 : 에러 메시지

    출처 : Tong - ssabro님의 Network Programming통

    posted by 랜달프
    2008. 4. 6. 15:53 Programming/C programming

    IP Header 정 보

    Version (4bit) : 데이터 통신에 사용된 IP 프로토콜의 버전, 현재는 IPv4

    Header Length (4bit) : IP헤더의 길이, 일반적인 IP헤더는 20바이트(32bit *5)이며, 그림과 같이 32bit단위로 나타낸다.
           
    Type of Service (8bit) : 데이터그램의 성격을 명시하여, 라우터나, 호스트 등에서 우선순위 서비스(Qos : Quality of Service)를 제공하기 위하여 제공된 필드(RFC 791참조)
                                   
    Total Length (16bit) : IP헤더와 데이터를 포함한 전체 IP패킷의 길이의 바이트 단위 필드
           
    Identification (16bit) : 분열된 데이터를 재배열하기 위해서 송신자가 데이터그램의 조각들에 부여한 일련번호(동일IP데이터그램에서 분열된 IP패킷들은 같은 일련번호)
           
    Flags (3bit) : 3개의 비트를 이용한 분열의 상태 정보를 제공하는 필드

    - bit 0 : 나중에 사용하려고 예약. 반드시 0이여야 함.
    - bit 1 : 0 = 분열 허용 / 1 = 분열 허용안됨
    - bit 2 : 0 = 현재데이터가 마지막 분열 / 1 = 뒤에 분열된 데이터가 있음

    Fragment offset (13bit) : 데이터가 전체데이터그램의 어느부분에 속하는지 나타내는 Byte단위 필드
         

    Time to live(8bit) : IP패킷이 네트워크에서 얼마나 오래 존재할 수 있는가를 나타내느 필드(0-255) 라우터를 하나 거칠때마다 1씩 감사하고 0이 되면 라우터에서 소멸시킴.
            
    Protocol (8bit) : IP데이터그램의 데이터 부분이 어떤 상위계층에 해당하는가를 나타내는 필드 (ex : TCP 6 / UDP 17 / ICMP 1 / IP 0 /IGMP 등)
           
    Header Checksum (16bit) : IP헤더의 헤더 비트의 합을 저장하는 필드로 네트워크를 통과하며 변경된 TTL, 또는 분열의 숫자 등에 의해 변경된 IP 헤더 비트의 합이 Header Checksum과 비교하여 일치 여부를 확인, 불일치 할 경우 손상된 것으로 판단하여 소멸

    Source IP address (32bit) : IP 데이터그램을 전송한 호스트의 32비트 IP주소 필드 

    Destination IP address (32bit) : IP 데이터그램을 수신할 목적지 호스트의 32비트 IP주소 필드

    options(필요할 경우) : 대부분 IP 데이터그램에는 포함되어 있지 않은 필드. 필요할 경우 40byte까지 생성가능. (ex : Security Options, Record Route, Strict Source Routing, Timestamp등)
           
    Padding ( Options에 따른 가변 길이 ) : IP헤더는 32비트 단위로 저장을 하는데, Options 부분이 32bit 단위가 되도록 만드는데 사용.


    ICMP Header 정 보    

    Type (8bit) : 에러메시지의 형태를 나타냄.

    Type  3 : Destination Unreachable - 목적지호스트로 가는 경로,포트를 확인할 수 없을 때

    Type  4 : Source Quench - 송신시스템이 너무 많은 데이터를 전송하여 수신호스트가 처리하지 못하여 분실 가능성을 알릴 때 사용.

    Type  5 : Rediret - 더 짧은 경로를 알고 있는 게이트웨이로의 정보를 알려주는 경우.

    Type 11 : Time Exceeded - TTL값이 0으로 소멸 or 재배열작업이 오래걸려 패킷이 소멸될 경우.

    Type 12 : Parameter Problem - IP 데이터그램 중 사용되어지는 옵션이 잘못 되었을 경우.

    Code (8bit) : Type에 나타난 에러 메시지의 하위 형태.

    Checksum (16bit) : ICMP메시지의손상여부를 검사하는 간단한 합으로 계산하여 판단한다.

    Unused (32bit) : 에러 메시지에 대한 추가 정보를 제공하기 위한 부분. 거의 사용되지 않음.
    Internet Header + 64 bits of Original Data Datagram (60 Bytes + 60bit)
                            : 문제가 생긴 원래 IP 데이터그램의 헤더와 데이터의 일부를 보내어 송신 호스트가 어떤 데이터그램이 실패했는지 판단하게 한다.
           

    TCP Header 정 보   

    Source Port (16bit) : 데이터를 전송하는 출발지의 포트 번호를 나타냄.

    Destination Port (16bit) : 데이터를 전송하는 목적지의 포트 번호를 나타냄.

    Sequence Number (32bit) : 전송되는 데이터의 일련번호를 나타냄.

    Acknowledgment Number (32bit) : 수신 데이터의 일련번호 + 전송된 데이터의 합을 나타냄.

    Data Offset (4bit) : TCP 헤더의 길이를 나타냄.(단위 : 32bit words. 보통 5)

    Reserved (6bit) : 예약된 6bit 이므로 항상 0이어야 한다.

    Control Bits(6bit) : URG, ACK, PSH, RST, SYN, FIN등의 회선 제어 정보를 담고 있다.

    Urgent Pointer : 최고 수준의 우선 순위, 가장 먼저 전송된다.

    Valid ACK : ACK필드의 숫자가 유효할때 1로 설정된다.

    Push Session : 우선순위가 좀 떨어지더라도 최대한 빨리 전송을 요구한다.

    Reset Session : 현재의 세션을 재시작 하려할때 사용된다.

    Sync Sequence Number : 1로 설정되어 있으면 목적지의 호스트에게 Sequence Number를 송신측의 Number와 동기화를 요구한다.

    Final Data : 목적지 호스트에게 데이터전송이 끝났음을 통보한다.

    Window (16bit) : 수신 시스템에서 처리할 수 있는 수신 버퍼의 크기를 나타낸다.

    Checksum (16bit) : TCP 세그먼트 전체의 체크섬을 저장한다.

    Urgent Pointer (16bit) : 급히 처리되어야 할 데이터의 마지막 바이트를 나타낸다.

    Options (필요할 경우) : 기본 크기는 0bit이며, 최대 40byte까지 생성할 수 있다.

    Padding (Options에 따라 가변 길이) : Options에 따라 32bit형태를 만들기 위한 영역.


    UDP Header 정 보   

    Source Port (16bit) : 데이터를 전송하는 출발지의 포트번호를 나타낸다.

    Destination Port (16bit) : 데이터를 전송하는 목적지의 포트번호를 나타낸다.

    Length (16bit) : UDP 헤더와 데이터 부분을 포함한 메시지 전체의 길이를 나타낸다.

    Checksum (16bit) : UDP 메시지의 손상여부를 검사하는 항목으로, 간단한 합으로 계산결과를 판단.

    [출처] TCP/IP Header 설명|작성자 핵폭

    posted by 랜달프
    2007. 12. 4. 04:03 Programming/C programming

    파일 열기 함수 fopen()의 모드

    1. r : 읽기(read) 모드로 파일을 연다. 파일이 없으면 에러가 발생한다.

    2. w : 쓰기(write) 모드로 파일을 연다. 파일이 없으면 새로 만들고, 기존의 파일이 있으면 그 이전의 내용은 없어지고 파일의 처음부터 쓴다. 이 모드로는 파일의 내용을 읽을 수 없다.

    3. a : 추가쓰기(append) 모드로 파일을 연다. 파일이 없으면 새로 만들고, 기존의 파일이 있으면 그 파일의 가장 뒤부터 파일에 추가한다.

    4. r+ : 읽기(read)와 쓰기(write) 모드로 파일을 연다. 파일이 없으면 에러가 발생한다.

    5. w+ : 읽기(read)와 쓰기(write) 모드로 파일을 연다. 파일이 없으면 새로 만들고, 기존의 파일이 있으면 그 이전의 내용은 없어지고 파일의 처음부터 쓴다.

    6. a+ : 추가쓰기(append) 모드로 파일은 연다. 파일이 없으면 새로 만들고, 기존의 파일이 있으면 그 파일의 가장 뒤부터 파일에 추가한다. 파일의 어느 곳이나 읽기는 가능하나 쓰기는 파일 끝에 추가적으로만 가능하다.

    posted by 랜달프
    2007. 12. 3. 22:50 Programming/C programming

    #include<stdio.h>

    void main(void){
     int ar[100][100];
     int x1 =0 , x2, y1 =0, y2 ; //벽
     int vx=1,vy=0; //백터
     int x=-1,y=0;    //배열에 들어갈 현재 값.
     int n ;  // 배열의 크기
     int i,j,su=0;
     scanf("%d",&n);
     //n=5;

     y2 = n-1;
     x2 = n-1;

     for(i=0;i<n;i++){
      for(j=0;j<n;j++)ar[i][j]=0;
     }

     printf("  su  x   y  vx  vy  x1  x2  y1  y2 \n");
     
     while(su<n*n){   ///n*n){
      x+=vx;
      y+=vy;
      ar[y][x] = ++su;
      printf("%3d %3d %3d %3d %3d %3d %3d %3d %3d  \n",su,x,y,vx,vy,x1,x2,y1,y2);
      if(x==x2 && vy==0 && vx==1  ){ //하로  (우일때)
      //printf("하\n");
      vx=0;
      vy=1;
      y1+=1; //윗벽을 없앰.
      }
      if(y==y2 && vy==1 && vx==0 ){//좌로 (후일때)
       //printf("좌\n");
       vx=-1;
       vy=0;
       x2-=1; //오른쪽 벽을 없앰.
      }
      if(x==x1 && vy==0 && vx==-1 ){ //위로  (좌일때)
       //printf("상\n");
       vx=0;
       vy=-1;
       y2-=1; //아래벽을 없앰..
      }
      if(y==y1 && vy==-1 && vx==0  ){//우로  (상일때)
       //printf("우\n");
       vx=1;
       vy=0;
       x1+=1; //왼쪽벽을 없앰..
      }
     
     }

     for(i=0;i<n;i++){
      for(j=0;j<n;j++)printf("%3d",ar[i][j]);
      printf("\n");
     }
     
    }

    사용자 삽입 이미지

    출력결과



    posted by 랜달프
    prev 1 2 3 4 next