[급해요]Unix와 Linux간 통신상의 문제

익명 사용자의 이미지

유닉스와 리눅스간의 소켓 통신 프로그램을 구현하고 있는데요..
이상하게 유닉스끼리는 아무 문제 없이 돌아가는데..
유닉스에서 리눅스로 메시지를 전송하면 이상한 값이 되네요..

송수신하는 데이타 타입은 struct로 정의한 겁니다.
struct Message{
int mNum;
char mData[MAXSIZE];
int mLen;
};

유닉스에서 리눅스로 보내고
리눅스에서 프린트하면
char 값은 정상으로 출력되는
int 값들이 엄청나게 큰 수가 프린트 되거든요

아시는 분 있음 알려주세요..

익명 사용자의 이미지

데이타가 메모리에 저장되는 방식의 차이때문에 그런것 같습니다..
즉 서버가 데이타 저장 방식이 big-endian이냐 little-endian이냐에 따라
서 그에 따른 처리를 해야 합니다..
아마도 두 유닉스와 리눅스 서버의 메모리 저장 방식이 틀려서 발생하는
것 같습니다.. int값을 보내거나 받을때 바로 값을 사용하지 마시고 htons
(htonl)나 ntohs(ntohl)함수를 사용하여 변환을 하시고 사용하십시요..

익명 사용자의 이미지

유닉스에서는 int형이 2byte 아닌가요?

테스트 해볼만한 곳이 없어서..

글구 리눅스에서는 4byte..
이런 차이 때문에 위 질문과 같은 문제가 생길수도.. 있을까요?

익명 사용자의 이미지

struct Message{
int mNum;
char mData[MAXSIZE];
int mLen;
} __PACKED__
아니면
struct Message{
int mNum;
char mData[MAXSIZE];
int mLen;
} PACKED;
가 되어야할 듯하네요.....&*^* 기억이 잘안나네요.

그냥 PACKED라고 검색해보면 대번에 그 사용법과 이유를 알 수 있습니다.
그럼 이만. 헤헤

익명 사용자의 이미지


기본적으로 int는 4바이트입니다. 확인을 해 보시고 싶다면 printf("%
d", sizeof(int));하시면 바로 4가 찍힐 겁니다. int가 2바이트였던
건 286때고 386이후로는 4바이트가 맞습니다.

x86은 Little-Engian이고 기타회사는 대부분 Big-Engian입니다. 따라
서 문제의 본질은 리눅스-유닉스간 통신이 아니라, 인텔과 비인텔 계열
프로세서의 메모리 저장 방식의 차이입니다. 예를 들면<00 00 00 01>을
보냈는데 받는 쪽에서는 <01 00 00 00>이 되니 큰 값이 되어 버립니다.

지금 개발하시는 프로그램에서 구조체 전체를 바로 패킷애 담아서 쏘고 있
다면 이 방법은 매우 위험한 방법입니다. 문제를 풀기위해서는 각각의 항
목을 엔디안 교정해 주는 함수인 htons / htonl나 ntohs /ntohl을 써
서 교정해 준 후 보내야 합니다.

TCP/IP는 big-endian을 표준으로 만들어진 규격입니다. 따라서 스팍이
나 밉스 계열 프로세서는 구조체를 바로 쏘아도 문제가 없지만, 인텔 프
로세서는 구조체를 그대로 쏘면 int같은 자료형은 값이 뒤집어 집니다.

참고로 Little-Endian을 쓰는 CPU는 인텔 x86과 DEX alpha가 있습니
다. 나머지는 CPU는 거의 예외없이 big-endian으로 보시면 됩니다.

그럼 인텔이 Little-Endian을 쓸까요? 정답은 원래 8080설계할때 하드
웨어 회로 조금 간단히 할려고 값을 뒤집어서 넣었답니다. 당시에는 프로
세서를 디자인하기가 아주 힘들었거든요. 설계툴이 없어서 컬러펜 / 컬러
테이프를 벽에 붙어가면서 디자인했답니다. 아주 유명한 얘기입니다.

익명 사용자의 이미지

답변 감사드립니다.. ^^ 좋은 정보 얻었네요..
이구. 제가 워낙.. 초보라서^^;;;

근데여.. 그럼.. 제가 알고있던 .. "유닉스에서는 int는 2byte이다!!"

이건 전혀 근거없는.. 내용인가요?? ㅡㅡaa훔.. 어디서 이런걸 듣구 온건
지... 쩝..

익명 사용자의 이미지

예전 16bit 컴에서는 int가 2byte맞을껄요?
다만 unix가 32bit체제에서 돌아가기에 4byte일뿐...

저도 이 값이 뒤집어 지는것땜에 고생고생 한적이 있었는데...
그걸 바꿔주는 함수가 있었군요. -_-;;

64bit컴퓨터가 나오면 그땐 int가 8byte가 되겠죠..??
이궁.. C 언어 레퍼런스북에 보면은..

"int는 최하 4byte인 자료형 이다."
라고 있던것 같았는데..
그 말은 그 이상두 허용한다는 말이 아닐까 싶은데. ^^;;

암튼 그냥 한마디 적어 봤습니다.

익명 사용자의 이미지

미래의 64비트 시스템에서 LP 64 또는 ILP64를 사용하게 될겁니다.
LP 64는 LONG과 POINTER만 64비트가 되고, INT는 32비트가 유자됩니다
ILP64는 INT와 LONG과 POINTER 모두가 64비트가 됩니다.

LP64를 지원하자는 쪽은주로 기존 소프트와의 호환성을 중시하는 회사들
이고, ILP64를 지원하는 회사들은 주로 소프트 성능을 더 중시하는 회사
들입니다.

PC는 어디로 갈지 잘 모르겠네요.
현재의 386이후의 PC는 ILP 모두 32라고 말씀드릴수가 있네요.

참고로, char연산보다 int연산이 더 빠르답니다.
어셈블리 코드 비교해보면 바로 알수 있수 있는데, 연산은 int로 하는데
char은 int로 변환하는 과정이 연산전과 연산후에 일어나므로 코드도 더
커지고 시간도 더 많이 걸리게 됩니다. 배열 같은 경우라면 char로 많은
자료형을 사용하면 효과적이겠지만, 하나하나의 변수라면 int가 가장 효
율적으로 동작합니다.

댓글 달기

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