소켓프로그램에서 구조체 수신방법

Clientserver의 이미지

 
 
struct DATA* message;
recv(ClntSock, message, sizeof(message)-1, 0);       
printf("%s", message.account);       

설명 : 일단 이렇게 코딩을 했는데요 printf부분에서 에러가 납니다.

recv()함수안에 파라미터로 뭘 넣어야하는지 받아온 구조체를 출력은 어떻게 하는지 모르겠습니다.

Necromancer의 이미지

printf()의 인수값은 구조체의 멤버변수를 가져오는 것인데 message 변수는 구조체가 아니라 구조체에 대한 포인터 입니다. message->account 로 써야 에러 안날겁니다.

send(), recv()의 송수신 버퍼는 void * 형 입니다. 변수 하나든 구조체든 앞에 '&'를 붙여서 그 주소 넣어야 합니다.

그리고 구조체 데이터를 그대로 네트웍으로 쏘면 변수 순서나 padding 문제때문에 안될 수 있고요.
구조체 데이터를 일정한 형식의 연속된 byte stream으로 만들어서 쏴야 합니다.
만드는데는 아래 2가지 방법이 있습니다.

1) 구조체 각 멤버를 위치하고 싶은 순서에 따라 memcpy()로 연속된 unsigned char 배열에 복사한 뒤 네트웍으로 쏜다. memcpy()에는 void *로 강제 형변환.
=> 어느 컴파일러건 다 통용 가능한 대신 상당히 짜증나는 코드가 나옴.

2) 비표준 packed 구조체(멤버변수 사이 padding이 없는 구조체)로 선언하기
=> 표준문법에 없는 비표준 컴파일러 확장이라 컴파일러 뭐쓰는지 보고 골라써야 함.

입니다.
웬간한 고급언어들은 serialization 관련 함수들이 있어서 이걸로 하지만 C는 이걸 알아서 만들어야.

Written By the Black Knight of Destruction

twinwings의 이미지

serialization 개념부터 있어야 합니다. 직렬화라고 하기도 하지요.

구조체에 동적할당이 들어가는 순간... 저렇게 구현할 경우 절대로 동작하지 않습니다.

그리고 network byte order도 같이 보셔야 할 것 같네요.

Anti-Lock의 이미지

struct DATA message;
int ret = recv(ClntSock, &message, sizeof(message), 0);
assert(sizeof(message) == ret);
printf("%s", message.account);

물론 기타 예외 상황 같은것은 고려하지 않았습니다.

댓글 달기

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