[완료]소켓으로 구조체를 보내려는데 잘 안됩니다. 중첩된 구조체입니다.

lemk000의 이미지

우선 제게 보내려는 메시지의 구조는 아래와 같습니다.

typedef struct _CGPointd {
    double x;
    double y;
} CGPointd;
 
typedef struct _Message {
    Byte messageType;
    CGPointd point;
    char text[10];
} Message;

그리고 보내는쪽에서 이렇게 처리 합니다

Message msg;
    msg.messageType = mLocation;
    msg.point.x = x;
    msg.point.y = y;
 
    send(clientSocket, &msg, sizeof(msg), 0);

위와같이 구조체 안에 point를 담는 구조체가 또 있습니다.
이렇게 값이 들어가서 이걸 소켓을 보냅니다. 제 생각엔 여기까지는 잘못이없는것 같습니다.

받는쪽은 이렇게 합니다.

char buffer[40];
Message *recvMsg;
 
msgLength = recv(clientSocket, buffer, sizeof(buffer), 0))
buffer[msgLength] = '\0';
recvMsg = (Message *)buffer;

이런식으로 하여 recvMsg안에 있는 구조체의 값을 접근하려고 합니다.

(*recvMsg).messageType

메시지 타입은 이런식으로 잘 나옵니다.
하지만 그 아래에 있는 point정보가 잘 안나오네요
안에 구조체가 또 들어있어서 그럴까요? 어떤처리를 해줘야 할지 모르겠습니다.

(*recvMsg).point.x, (*recvMsg).point.y

이런식으로 접근해서 로그를 찍어보면 둘다 값이 0.0이 나옵니다.

도무지 잘 모르겠습니다. 살려주세요.

shint의 이미지

잘되는데요 ㅇ_ㅇ??

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

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

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

lemk000의 이미지

잘 된다구요??
;;;;;;;;;;;;;;;;;;;;;;;;
왜 전 안될까요 ... ;;;;;;;;;;;;;;;;;;;; 이런경우가 ㅠㅠㅠㅠ

gilgil의 이미지

TCP 환경에서
recv의 return값이 원하는 크기(sizeof(Message))보다 작은 경우가 있을 수 있습니다.

정 안된다면 wireshark와 같은 툴로 실제로 네트워크상으로 전송되어 지는 packet을 잡아 디버깅해 보시길...

태훈의 이미지

1. __attribute__((packed))

2. gilgil님 말씀처럼 TCP는 recv 길이 체크해서 루프 돌려야 합니다. 신뢰성 있는 데이타 전송이 꼭 필요한게 아니라면 이런 경우에는 UDP가 편합니다.

Just do it!

redistuo의 이미지

Message structure를 보시면 char 타입과 double 타입을 가지고 있는 CGPointd가 혼재되어 있습니다...

예전 기억으로는 이런 경우 #pragma pack(1) 등을 사용해서 1byte packing을 적용하셔야 원하시는 결과가 나올 것으로 생각됩니다.

보통은 이런 경우를 피하기 위해서 전부다 char 타입으로 바꿔서 전송을 하고 받은 다음 다시 변환해서 사용하기도 합니다.

네트워크 오더라던지, 엔디안 문제를 피하기 위해서 말이죠....

--=== from redistuo ===--

lemk000의 이미지

제가완료 태그를 안달았는데 문제가 이것때문이었습니다.
패딩문제였는데 이거때문에 며칠밤 날렸네요 ㅋㅋㅋ 암튼 감사합니다.

댓글 달기

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