2011년 4월 22일 금요일

sizeof(short) == 2

매번 char, int, string, ... 만 다루다가 이 단순한 것 때문에 2시간을 욕봤네.

이더넷 헤더출력을 구현하다가 분명히 제대로 코딩했다고 생각했는데
프로토콜 필드가 IP든, ARP든 모두 IP로 출력되는 것이 이상하고 또 이상했다.

wireshark와도 비교하면서 왜 그런지 계속- 고민하다가
이미 짜여진 샘플코드와 정말 하나하나 비교하면서 찾아낸 것이,

struct ether_header {
    u_char ether_dhost[...];
    u_char ether_shost[...];
    u_short ether_type;
}
라고 해야할 것을 나는,

struct ether_header {
    u_char ether_dhost[...];
    u_char ether_shost[...];
    u_char ether_type;
}
라고 해버렸던 것이다.

ip에 대한 프로토콜 필드값이 0x0800,
arp에 대한 프로토콜 필드값이 0x0806이고,
char가 1byte, short가 2byte인 것을 생각해봤을때,
char는 1byte로서 08만 받아서 앞에 1byte만 비교를 하니
당연히 처음 비교하는 ip와 매칭이 되서 계속 ip를 출력하고 있었던 것이다.

아.. 내 아까운 2시간.. 시험공부도 해야하는데 -.-
그래도 이러고나면 나중에 까먹진 않겠지? 설마~

마지막으로 짚고 넘어갈 것은 이더넷 헤더는 상위 헤더와는 다르게 
destination addr가 source addr보다 앞에 나오더라.
IP 시험공부할 때도 몰랐는데 이제라도 알았으니 다행..

댓글 없음:

댓글 쓰기