htons() 함수에대한 질문입니다~

seacloud의 이미지

안녕하세요 ,

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 입니다

bushi의 이미지

그런 것에 신경쓰지 말라고 있는 것이 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

mirr187의 이미지

가끔씩 네트워크 프로그램 작성하면서 찍어볼때 있지 않나요? -_-;

전 가끔씩 밀린 바이트 찾아낼때 hex code로 dump 떠서 확인하곤 하는데..ㅎㅎ;;

bangwall의 이미지

질문자님도 아시듯이.
참고로 host는 little endian , target은 big endian 입니다

즉 htons는 호스트 to 네트워크로 변환하는 것으로
패킷을 보낼때 ntohs 받을때 htons로 받는 것입니다.

그러므로 네트워크 오더링은 빅엔디안이므로 arm에서는 ntohs , htons 모두 같은 값이겠지요
머신 자체가 빅엔디안이니까 네트워크 오더링으로 변환해도 빅엔디안인 입니다.

그러나 머신이 리틀엔디안 체제라면, htons로 빅엔디안으로 오더링을 수정한다음
받으면 ntohs로 다시 리틀엔디안으로 수정하므로 값이 달라지게 됩니다.

(__)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.