htonl과 ntohl의 차이를 알고 싶습니다.

shint의 이미지

123456789 같은 값을 넣은후

htonl(123456789)
IN 00000111010110111100110100010101
OUT 00010101110011010101101100000111

ntohl(123456789)
IN 00000111010110111100110100010101
OUT 00010101110011010101101100000111

결과값이 둘다 같았습니다.

ntohl : Big Endian --> Little Endian : network byte order --> host byte order
htonl : Little Endian --> Big Endian : host byte order --> network byte order
라고 하는데 말은 차이가 있는데 둘을 서로 바꿔써봐도 되서요.

어떤 차이가 있는지 알고 싶습니다.

절차탁마의 이미지

사용하시는 시스템 cpu가 big endian인가 보군요^^

사용하는 cpu가 big endian일때
서로 바꿔써도 상관없지만 아예 않써도 됩니다.

little endian cpu인 경우는
바꿔쓰면 않되고요, 반드시 써야합니다.

network byte order는 big endian이라는 점을
명심하시면 혼동이 없을겁니다.

shint의 이미지

둘을 사용하기는 하는데
두 함수의 기능이 같습니다. 같은 기능의 함수를 이름만 바꾼 이유가 뭘까?가 질문의 요지입니다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

M.W.Park의 이미지

기능이 동일하다는 말은 좀 잘못된 듯하군요.
시스템에 따라 결과값이 같을 수 있다 정도가 정확할거같은데요.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

shint의 이미지

저 결과값은 윈도우에서 실행해서 동일하게 나왔다는 말이군요?
리눅스에서도 해봐야지겠네요 ㅇ_ㅇ'''

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

절차탁마의 이미지

cpu의 endian을 바꿀수 있지 않는한
OS보다는 cpu에 따라 달라집니다.
그리고 x86을 사용하는 os에서는
위와같은 결과가 않나옵니다.

그리고 아래분들 말씀대로 portability를
생각해서 사용하는게 좋습니다.

shint의 이미지

제 노트북.(윈도우)에서 나온결과입니다.
x86에서 나온 결과로 생각됩니다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

절차탁마의 이미지

혹시나 해서 직접해보고 나서
제가 잘못된 답변을 했다는것 알았네요.

질문요지는 똑같이 swap이 되는데
함수이름을 달리 할 필요가 있는냐?
이 말씀이지요? ㅋㅋㅋ

그렇다면 답할수있는것은
portability, readability 밖에
없을것 같습니다.

shint의 이미지

가독성이라고는해도 어차피 같아서요....
결과적으로 차이가 없는거군요. ㅇ_ㅇ'''

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

hayarobi의 이미지

원래 용도대로 쓰시는 게 가장 좋지 않을까 싶은데요.

big endian, little endian세상에서는 ntohl과 htonl이 서로 같은 로직이겠지만. (제가 볼 때는 전혀 없어 보이지만) 이 두 방식이 아닌 전혀 다른 식으로 값을 저장하는 아키텍쳐라 저 두 함수가 다른 로직을 써야하는 상황이 생긴다면 곤란하겠죠.

그것보다 더 큰 이유는 소스의 가독성이 문제같네요. ntohl이 쓰인 코드라면, 정상적인 의도라면 입력값은 네트웍바이트 오더의 값이고 출력은 호스트의 바이트 오더를 가진다는 것이 명백하게 보입니다. 저것 안 지키고 같은 기능이라고 섞어쓰거나 하나만 쓰면 코드 짠 지 두세달만 지나도 코드 다시 볼 때 머리에 쥐가 날 가능성이 상당히 높아질 것 같네요.

---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥 오에스 텐, 맥 오에스 클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com

=================
잠못자는 한솔아빠

M.W.Park의 이미지

시스템에 따라 생략가능하긴 하지만 portability를 위해 써주는 습관을 가지는 것이 좋습니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

치우의 이미지

우선 답변 하기전에 이런 질문을 드립니다.
서버가 모든 클라이언트의 엔디안에 대응 한다면 이것이 효율적입니까?
아니면 클라이언트가 서버의 엔디안에 대응하도록 하는 것이 효율적일까요?

이는 당연히 후자가 더 효율적입니다.
서버가 엔디언을 판단하는 프로토콜에 무엇인가 마련하고...
그에 대응한다면... 서버의 부하는 막중하겠죠!!!

따라서 클라이언트가 송신 단에서 호스트로 전송 시 ntohl를 씁니다.
즉 네크워크 ---> 호스트로 전송전에 엔디언 교체 함을 의미하고,
수신의 경우는 htonl를 써서 수신 후,...해당 데이터의 엔디언 교체 합니다.

이는 문자열이 아닌 수치형의 모든 데이터에 유효 합니다.
즉 송신 단에서 쓰는 것과 수신 단에서 쓰는 것을 구분하여 사용 하지는 의도 입니다.
ㅆ지만
물론 반대로 사용해도, 구분하지 않고 사용 해도 무관하다고 할 수 있지만...
이는 구분 하지 않고 쓰는 것에는 가독성에 의거하면...

bushi의 이미지

10여년전 글에 이런 댓글을 다신 이유가...

hton*(), ntoh*() 의 h 가 host 인 것은 맞지만, server를 의미하는 게 아니라 (local) machine 의 의미입니다.
즉, machine-to-network, network-to-machine 을 의미하는 겁니다.
그러므로 완전히 반대로 설명하셨습니다. 전송 시에 hton*(), 수신 시에 ntoh*() 을 씁니다.
효율이나 부하를 따져야되는 상황이라면, 서버 머신을 network byteorder 와 같은 big endian 을 사용하는 CPU 로 꾸미면 되겠죠.

어플리케이션 프로토콜(온라인게임같은)을 말씀하시는 거라면,
프로토콜 설계때 주력 서버 머신의 endian 을 기준으로 스펙을 확정하고 클라이언트들이 거기에 맞추면 되겠죠.
서버가 little endian 머신 뿐이라 프로토콜 사양에서 little endian 만 사용한다고 확정한 상황에서,
클라이언트 머신의 CPU 가 big endian 일 경우에 클라이언트 측이 ntoh*() 를 쓰는 트릭이 가능하지 않냐고 생각하는 거라면 그것도 아니라고 말씀드리겠습니다.
클라이언트 머신의 CPU 가 big endian 이고, 설치한 libC 가 제대로 된 놈이라면, 그 머신의 libC 에서는 ntoh*() 이건 hton*() 이건 아무 연산도 하지 않습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.