endian에 관한 질문..

avatar80의 이미지

흠..코드를 보다보니 의문이 생긴 건데요..
htons 이나 htonl 같은것이 인디안 문제를 해결해 준다고
들었는데요. 그러면 실제 데이타는 어떻게 전송되는건가요?
send나 recv함수에서 해주는것인지..아니면 다른곳에서 바뀌어지는 것인지..
궁금합니다. 답변 부탁드립니다.

kimsk99의 이미지

hton 은 host-to-network의 약자입니다.
즉 host의 endian을 network용 endian으로 바꿉니다.
network endian은 제가 알기로 big endian으로 알고 있습니다.

그러므로 hton을 big endian인 컴퓨터에서 콜하면 값이 변하지 않고 그대로 리턴됩니다.
반대로 small endian인 컴퓨터에서는 small -> big의 endian변경이 일어난 값이 리턴됩니다.

사용은 network에 데이터를 보낼 때는 모든 자료를 hton으로 바꾸어서 싣고, 반대로 수신할 때는 ntoh로 바꾸어 얻습니다.
그래서 network에서는 network endian을 지켜서 쓸수 있도록 하고 각 host에서는 자신의 host에 맞는 endian을 쓸수 있도록 하는 것이죠.

avatar80의 이미지

아..그러면 port와 address를 그런식으로 저장하게 되면
실제 패킷을 날릴때도 인디안문제를 처리하는 건가요?

^^ 함께 커가는 세상

운형의 이미지

데이터를 어떤 방식으로 보내느냐에 따라 조금 달라지는데요.

send나 recv의 인자 중에 보내는 버퍼의 타입이 보이드라는거 아시져?

보통 sprintf같은 걸로 숫자도 문자열에 포함 시켜서 보내버리고 프로토 콜에 마춰 파싱한후 atoi같은걸 사용하는데...(제가 처음 네트웤 프로그램 작성 하던 당시... )

때에 따라서는 프로토콜을 구조체의 형태로 정의 하는게 좋을 때가 있습니다.

struct data{
     int index;
     int value;
};

struct data Data;
Data.index = 1;
Data.value = 2;

send(fd, &Data.....)

이렇게 보내면 recv(fd, &Data...) 해서 파싱이구 머구 한방에 해결될거라 생각하는데... 결과보구 놀라죠...
바이트 오더에 맛가는 일이 생기는 거죠..

주소구조체에 값체워 넣는일은 거의 정형화 된거라, 생각없이 포트 넣을때 바이트 오더 바꿔서 너주지만 위의 예처럼 데이터 보낼때는 무심코 바이트 오더 생각안하고..

하여간 그렇네요..

Do you think that's the air you are breathing now?

asteroid의 이미지

쉽게 생각하시면 될것 같습니다.

TCP/IP 프로토콜 레이어에서 데이터의 presentation에 대한 책임은

어플리케이션에 있습니다. 따라서, 네트워크를 경유하는 모든 데이터는

네트워크 바이트 오더에 맞추면되지요.

Socket라이브러리에서 사용하는 IP어드레스와 포트넘버 또한

각각 패킷과 세그먼트의 헤더에 복사되어 네트워크를 따라 이동하는

데이터이니, 마찬가지로 바이트오더링을 맞춰주어야지요.

댓글 달기

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