structured data의 통신은 어떻게 하나요 ?
글쓴이: sirang / 작성시간: 수, 2003/12/03 - 12:01오후
안녕하세요.
socket으로 통신할때, 기본적으로 character의 stream을 주고 받는데요,
만약
struct my_data {
int a;
int b;
}
위와같은 structure를 주고 받고 싶으면 어떻게 해야 하는거죠 ?
읽는 함수는 read()를 이용할 생각이구요.
제가 생각하고 있는 것은 다음과 같습니다.
char buf[MAX]; struct my_data * my; read(fd, buf, MAX); my = (struct my_data*)buf;
이렇게 하고나서 아래와 같이 사용할 수 있는 건가요 ?
tmpa = my->a; tmpb = my->b;
혹시 network byte order 등의 문제로 이렇게 하면 문제가 생기는지요 ?
아니면 또다른 방법이 있나요 ?
많은 조언 부탁드립니다.
Forums:
network ordering 관련함수를 이용해서 처리하세요
통신을 할 양 MACHINE의 OS외 기계적인 환경이 동일하다면
올리신 코드는 우선 운용되는 대는 문제가 없을 수 있습니다.
하지만 서버와 CLIENT가 OS가 틀린다든지 하면 문제가 발생합니다.
INTEGER LONG등을 송수신하시기 전에 아래의 함수를 이용해서
변경해서 설정하시면 됩니다.
Re: structured data의 통신은 어떻게 하나요 ?
굳이 이렇게 할 필요 없으신듯 싶은데..
바이트 오더만 danielkim 님이 말씀하신대로 해결해 주신다면, 이렇게 해주시는게 약간 더 편하지 않을까 싶은데.. ^^
지금 같은 경우는 a 와 b 가 같은 int 형이지만, 만일 a 가 sh
지금 같은 경우는 a 와 b 가 같은 int 형이지만, 만일 a 가 short 나 char 이면
이게 실제 메모리에서 6 바이트 (a 2 + b 4) 를 차지할지, 8 바이트 (a 2 + padding 2 + b 4) 를 차지할지는 아키텍춰에 따라 다른 걸로 알고 있습니다.
그렇다면 단순히 char * 로 변환해서 보내고 받은 후 data->a data->b 와 같은 식으로 접근하는 것이 문제가 될 수 있지 않을까요?
(제가 정확히 아는 것이 아니라서... 틀리면 지적 바랍니다)
좋은 하루 되세요!
Re: network ordering 관련함수를 이용해서 처리하세요
danielkim님께서 말씀하신 것처럼 이기종간 통신에서는 structure를 바로 보낼 경우는 padding에 의한 문제가 발생할 수 있다고 합니다.
이와 비슷한 일을 전에 해본적이 있습니다만,
Linux(intel cpu) <---> window(intel cpu)는 아무런 문제가 없었습니다.
window(intel cpu) <----> HP-UX11은 integer의 경우 byte ordering문제가 생겼습니다. (예상은 하고 있었습니다. :wink: )
To be a rich
raymundo 님의 글에 추가되는 글
raymundo님의 글에 추가로 사족을 달고자 합니다.
말씀하신대로 struct 형태의 데이타 타입을 compile해서 sizeof 해 보면
compiler에 설정된 byte-alignment option 에 따라 크기가 달라지는
것이 맞습니다. (현재 팬티엄 cpu를 채용한 os의 경우 4-byte alignment가 default상태입니다)
따라서 해결하려면 이를 해결하려면 두가지 방법이 있습니다.
1. integer, long 등을 ascii 문자열로 구성되도록 프로토콜을 설계한다.
2. compile 시 1-byte alignment로 설정한다.
(이경우 프로그램의 처리 속도를 trade-off 해야하는 단점이 있습니다)
도움 되시길 바랍니다.
Re: structured data의 통신은 어떻게 하나요 ?
오류가 있네요
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
Re: structured data의 통신은 어떻게 하나요 ?
답변 감사합니다.그런데 danielkim 님께서 아래와 같이 말씀
답변 감사합니다.
그런데 danielkim 님께서 아래와 같이 말씀하셨는데요.
1, 2 에 대해서 좀 더 자세히 설명해주실수 있을까요 ?
[quote="sirang"]답변 감사합니다.그런데 danielk
예를 들어 { 12, 655357 } 이라는 데이타를 보내기 위해서 12|655357 이렇게
문자열 형태로 보낸다는 말 같습니다. | 문자는 둘 사이의 구분자로 사용하고요
문자열로 할 경우 보낼 데이타가 약간 길어지는 단점이 있지만 이 단점을 극복
하고도 남을 이기종간의 복잡도는 생각 안해도 되죠(또 단점은 문자열 -> 내부 타입으로 변화. 12라는 문자열을 변환하기 위해 atoi 같은 함수를 사용해야
한다는 거죠).
인터넷 프로토콜들은 대부분 문자열 기반이 많죠. HTTP
screen + vim + ctags 좋아요~
예를 들어 보도록 하겠습니다.
질의하신 내용에 추가적으로 답변을 올리니 참고 하시기바랍니다.
도움되시길 바랍니다.
댓글 달기