htons() 함수에대한 질문입니다~
글쓴이: seacloud / 작성시간: 금, 2008/12/19 - 12:15오후
안녕하세요 ,
5060 포트를 htons()를 이용하여
socketaddress.sin_port 안에 넣었습니다.
그런데 host의 gcc를 이용하여 나온 htons의 리턴값과
target쪽 arm-linux-gcc를 이용하여 나온 htons의 리턴값이
틀립니다.
ex) htons(5060)
host => 50195
target => 5060 //그대로 나오네요.
두 값이 틀리게 나오는것이 정상인가요? 아니면 target쪽이 잘못된 것인가요?
혹시 endian 의 차이가 이런 결과를 가져올 수도 있는건가요?
참고로 host는 little endian , target은 big endian 입니다
Forums:
그런 것에 신경쓰지
그런 것에 신경쓰지 말라고 있는 것이 hton() 계열과 ntoh() 계열입니다.
network byte order 와 host byte order 간의 변환을 담당합니다.
해보셨으니 아시겠지만, network byte order 는 big endian 입니다.
패킷의 payload 를 제외한 모든 부분은, 전 세계의 모든 장비에서 big endian 으로 해석됩니다.
그러므로, host 에서 printf("%d",xx) 로 찍어보는 것 자체가 오류입니다. 아무데서도 그런 식으로 해석하지는 않기 때문입니다.
network byte order 는 big endian 이다... 라는 것 자체도 기억하지 않는 편이 좋습니다.
network bytye order 를 가진 자료는 반드시 host byte order 로 변환해서 사용해야 한다는 것만 기억하세요.
OTL
가끔씩 네트워크
가끔씩 네트워크 프로그램 작성하면서 찍어볼때 있지 않나요? -_-;
전 가끔씩 밀린 바이트 찾아낼때 hex code로 dump 떠서 확인하곤 하는데..ㅎㅎ;;
다른게 맞습니다.
질문자님도 아시듯이.
참고로 host는 little endian , target은 big endian 입니다
즉 htons는 호스트 to 네트워크로 변환하는 것으로
패킷을 보낼때 ntohs 받을때 htons로 받는 것입니다.
그러므로 네트워크 오더링은 빅엔디안이므로 arm에서는 ntohs , htons 모두 같은 값이겠지요
머신 자체가 빅엔디안이니까 네트워크 오더링으로 변환해도 빅엔디안인 입니다.
그러나 머신이 리틀엔디안 체제라면, htons로 빅엔디안으로 오더링을 수정한다음
받으면 ntohs로 다시 리틀엔디안으로 수정하므로 값이 달라지게 됩니다.
(__)
댓글 달기