네트워크로 보낼때 float 타입은 어떻게 보내야 하나요?

divetou의 이미지

float형도 int와 같이 4바이트라고,

보낼때

htonl( float형 변수 );

를 보내고,

받을때, ntohl( 받은 변수 );

이렇게 받으니 제대로 되지가 않네요..

ntohl 이나 htonl 같은 함수가 없는지 궁금합니다..

고수님들의 답변 기다리겠습니다 ㅠ_ㅠ

bugiii의 이미지

아마도 형변환 문제인 것 같습니다.
약간의 포인터 캐스팅이나 공용체를 쓰셔야 할 듯 합니다.

먼저 보내는 쪽에서 htonl 호출시 그냥 실수형 변수를 쓰셨다면 이것은 소수점을 버리고 정수형으로 형변환 되어 버린 상태에서 함수가 호출될테니 변환되는 것은 당연히 그 실수의 정수부분만의 네트웍 바이트 형태가 될 것입니다.

보내는 쪽에서 제대로 보냈다고 하더라도 받는 쪽에서 똑같이 그런식으로 한다면 마찬가지 결과가 있겠습니다.

그럼, 이만...

divetou의 이미지

유니온으로 어떻게 하는것은 되는것 같습니다만,

좀더 쉬운것은 없을까요?

푸념이지만,

왜 float타입은 네트워크 바이트 오더로 바꾸는 함수가 없는거죠? ㅠ_ㅠ;

뭔가 이유라도 있을듯 한데..

아직 초보라.. 궁금하네요 ㅎㅎㅎ

==============================
꿈꾸는소년

bugiii의 이미지

공용체로 어떻게 하면 된다는 말씀은...
간단하게 함수로 만드실 수도 있다는 것 아닙니까?
그럼, 이만...

freeman3의 이미지

정확히는 기억안나지만 3년전에 float는 바이트 오더 변환없이 그냥 보내고 받았던거 같은 기억이 나네요 :shock:

purewell의 이미지

ㅡ_-) 머신만 같다면...

IBM호환 32/64bit끼리라면 그냥 보내도 상관 없을 듯 아뢰요.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

ssehoony의 이미지

주고 받는 플랫폼이 항상 같다면 그냥 바이너리데이터를 그대로 쏘면 되겠죠.
데이터 주고 받는데 시간이 아주 크리티컬 한 요소가 아니라면
가장 좋은건 텍스트로 변환해서 아스키로 보낸후에 받는데서 다시
받는 시스템에서 아스키를 실수로 변형하는게 좋을 것 같네요.

정수는 잘 보낼줄 아는데 실수 보내는게 문제이면서 동시에
실수 값의 MAX 와 MIN을 알고 있다면 실수에 적당한 값을 곱해서 정수로
고친후 네트워크로 쏘고 받아서 다시 나누는 방법도 있겠네요.

mach의 이미지

XDR(external data representation)이 해결책입니다.
기본 자료형 ,..., 구조체, 등등 까지 네트워킹 자료 교환을 위한 데이터형을
정의합니다. RPC와 연관이 있지요.
RFC를 한번 읽어보시면 개념정립에 도움이 될것입니다.
http://www.faqs.org/rfcs/rfc1014.html
man xdr_float

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

체스맨의 이미지

네트워크 바이트 오더가 big endian 이니까, little endian 머쉰이면
직접 뒤집어주셔도 되고, 다음과 같이 htonl, ntohl 을 사용하실 수
있습니다. ( 단, sizeof(int)==sizeof(float) 일 때 )

float value = 3.141592f;
int received = (int)htonl( *(int*)&value );
*(int*)&value = (int)ntohl(received);

물론 두 머쉰은 IEEE floating point 규격에 맞아야 합니다.

<--- 이 부분...
"두 머쉰의 floating point 규격이 맞아야 합니다"
가 더 일반적이겠군요.

Orion Project : http://orionids.org

whitekid의 이미지

음... 같은 언어로 서버와 클라이언트가 작성할 경우는 바이너리도 가능한데..
전 호환성을 위해서 모든 데이터를 문자열로 변환하여 출력합니다..

sprintf로 출력해서 ...~

언어가 달라도 문자열 해석가능하면 모든 언어와, 플렛폼과 상관없이 호환 가능하죠.. ^^

What do you want to eat?

ssoo76의 이미지

Quote:

float value = 3.141592f;
int received = (int)htonl( *(int*)&value );
*(int*)&value = (int)ntohl(received);

오홀 이런 방법이...

(int)value 형태로 직접 cating을 하면 소수점이 truncate 되어버려 memcpy를 이용해서 int 변수에 복사한후 htonl() 등의 함수를 사용하면 될 듯했는데...

다른데도 많은 응용이 가능하겠네요...

세상은 하나..........

divetou의 이미지

좋은 답변들 감사드립니다 :o

저는 일단

typedef union _uifunion {
   unsigned int ui;
   float f;
} uifunion;

uifunion htonfu(float f);
float ntohfu(uifunion uif);

uifunion htonfu(float f) {
   uifunion uif, uif2;

   uif.f = f;
   uif2.ui = htonl(uif.ui);

   return uif2;
}

float ntohfu(uifunion uif) {
   uifunion uif2;

   uif2.ui = ntohl(uif.ui);

   return uif2.f;
}

이렇게 함수를 만들어서 사용하고 있는데.

잘 돌아가는군요 ^^;;

ㅎㅎ

다시한번 감사드립니다.

좋은 주말 보내세요!

==============================
꿈꾸는소년

댓글 달기

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