[질문] 소켓을 사용해서 구조체를 전달하는 방법에 대해...

runkid의 이미지

리눅스에서 C언어로 소켓을 사용한 간단한 서버 클라이언트 코드를 작성중입니다..

간단한 문자열은 서버측에서 받아서 printf()로 화면에 출력하면 제대로 전달된다는 것을 알 수있는데 클라이언트에서 구조체를 전달 할 경우 그것을 서버에서 받아보는게 잘 안되고 있습니다..

제가 작성한 코드를 대강 보자면.. 우선 클라이언트측 구조체는 이렇습니다..

struct data
{
int length;
char *device;
}

struct data info;
이녀석의 멤버에 값을 주고 send()로 서버에 보냅니다..

if(send(sock, (struct data *)&info, sizeof(info)) < 0)
...

그리고 이녀석을 서버측에서 recv()로 받습니다..
서버측도 클라이언트측과 동일한 구조체를 만들어 사용했습니다..

if((rsize = recv(clientSock,(struct data *)&ni, sizeof(ni),0))<0)
....

이런식입니다..
서버측에서 받아서 printf()문으로 받은 메시지를 확인해보면
구조체data의 멤버중 int형 멤버인 length는
정확한 값이 출력되는 반면
char *형 멤버인 device는 엉뚱한 글자들이 출력되더군요..

제가 구조체를 전달 하는 방법이 틀렸다면..
혹은 받은 구조체의 멤버들을 다시 가공을 해야하는건지..
올바른 방법을 알고싶습니다...

소타의 이미지

char *device는 포인터입니다.
device라는 포인터에 담긴 주소의 값까지 전달되지는 않습니다. 4바이트(일반적으로..)의 주소값을 전달해줘 봤자 전달받은 쪽의 같은 메모리 주소에 값이 있을리 만무하구요.
char device[200] 이런식으로 고정시켜주면 전달이 잘 될겁니다.

Fe.head의 이미지

struct data
{
 int length;
 char device[10];          /* char *device; */
}

struct data info;

위처럼 바꾸시던가..

아니면 send에서 따로따로 보내셔야 합니다.

info.device = malloc(10);
snpfintf(info.device, 10, "abcdefg");
info. length = strlen(info.device);

send(&info.length, sizeof(info.length));
send(info.device, info.length);

엄연히 말해
char * device; 는 포인터이고 이는결국 4바이트짜리 메모리 공간입니다..

char * device = malloc(10); 과 같이 했으면

device 에는 malloc가 할당한 메모리 주소를 가지고 있을 뿐입니다.

위 struct를 send를 하면 길이하고 메모리 주소가 보내지겠죠..

PS) 윽.. 빠르닷. 벌써 답글이.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

runkid의 이미지

자세한 설명 감사드립니다...

익명 사용자의 이미지

구조체 내의
int length;
에 대해서는 htonl(), ntohl()등을 사용해서
바이트 순서를 맞춰줘야 합니다.

"big endian 대 little endian"을 기억하세요.

댓글 달기

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