구조체 구별법????

porcokang의 이미지

FIFO로 양방향 통신하는 프로그램을 만들고 있습니다.

그런데 문제는
한쪽에서 fifo파일에 여러 종류의 구조체를 쓰는데..
읽는 쪽에서는 이를 어떻게 구분해야 할까요??

다시말해

구조체 종류는 A, B, C 이렇게 있어서 쓰는쪽에서 상황에 따라 다른 구조체에 데이터를 쌓아서 보내죠
그럼 읽는쪽은 루프를 돌면서 fifo파일을 읽어들이는데,
read()에 읽을 버퍼를 세가지 구조체중 어떤걸로 할지 구분을 어떻게 해야 하나요?

읽는 쪽은 보내는 쪽이 셋중 어떤 구조체로 보냈는지 알지 못하는 상황입니다.

jachin의 이미지

전달되는 데이터 단위가 세가지 구조체의 데이터형을 갖는다는 말씀이신가요?

아니면 전달되는 데이터 단위가 세가지 종류가 있다는 것인가요?

단위가 세가지라면 통신이 이뤄질 수 없는 것 아닐까요?

데이터 단위에 세가지 구조체의 데이터 형을 갖는다면,

순차적으로 1 구조체, 2 구조체, 3 구조체, (Null), 1 구조체, 2 구조체, 3 구조체...

로 보내면 되지 않을까요?

만약, 1 구조체만 쓴 상황이라면, 2 구조체와 3 구조체도 (Null) 로 채우면 되고요.

그러고보니 '동기화' 하기가 어렵군요. 쩝... 프로토콜을 잘 설정하셔야 할 듯.
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

익명사용자의 이미지

각 구조체마다 상위 메모리에 header id (2-bit) 를 두면 될 것 같습니다.
따라서, FIFO 에 들어오는 구조체의 순열에 독립적으로 동작하면서
header id bit만 검사하시면 될 것 같은데요.

- header id : 2-bit
00 : 1st structure
01 : 2st structure
11 : 3st structure

- ...
- ...
- payload

porcokang의 이미지

struct A {}
struct B {}
struct C {}
이렇게 구조체가 3개가 있을때..

한쪽에서 fifo파일에 여러종류의 구조체를 쓰게죠..

struct A a;
struct B b;
struct C c;

write(fd, a,...);

그럼 fifo을 읽는쪽에서는

struct A a;
struct B b;
struct C c;

read(fd, &a, ...); 이런식으로 읽는건데..

만약 쓰는쪽에서 b를 보냈고, 읽는쪽에서 그대로 a로 읽는다면 문제가 발생하겠죠..

그래서 읽는쪽이 어떤종류의 구조체가 있는지는 알지만, 그때그때 어떤 구조체로 왔는지는
모르기때문에.. read함수에 어떤 구조체로 읽어들일지 모르겠습니다.

이런 경우의 문제해결 방법으로는 뭐가 있을까요?

익명사용자의 이미지

위 익명사용자인데, 영어 단어 오타네요.
1st, 2nd, 3rd

superkkt의 이미지

read의 buf는 void * 입니다. 일단 char array로 윗분 말씀처럼 헤더 ID를 분석해서 해당되는 구조체 사이즈만큼 다시 읽어들인 후 캐스팅해서 사용하면 될듯싶습니다. 만약 3가지 구조체의 사이즈가 동일하다면 그냥 char array로 쭉 읽어들인 후 캐스팅해서 사용하면 되겠구요.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

ㅡ,.ㅡ;;의 이미지


스타일에따라 몇가지 방법이 있겠지만..

헤더와 body 가 구분된형태 일단 보내는쪽이
헤더 -> 구조체 -> 헤더 -> 구조체
형태로 보내고 받는쪽에서 헤더먼저 읽고 구조체를 선택할수있겠죠..

두번째 구조체내부에 헤더를 포함하는경우

일단 일정크기를 읽어봅니다. 헤더보다는 커야겠죠..헤더를 분석해서
구조체전체의 크기를 계산하고 덜읽은부분마저 다 읽습니다.
그런후 읽은 데이터를 구조체에 memcpy 하면됩니다.


----------------------------------------------------------------------------

irondog의 이미지

어떤 구조체로 전송을 했는지에 대한 정보는 패킷에 포함시키는 방법 말고는 없습니다.

ㅡ,.ㅡ;;님께서 말씀하신 방법을 다시 풀어보면...

1. 하나는 패킷에 헤더를 넣는 방법이 있을테고요.
그럼 매번 읽을 때 헤더일고 스트럭처 읽고... 그래야겠죠.

2. 또다른 방법은 헤더를 스트럭처 안에 넣는 방법이죠.

struct header
{
int type;
}

struct A
{
struct header hdr;
int aa;
int ab;
}

struct B
{
struct header hdr;
int ba;
int bb;
}

이렇게 선언하면 struct A,B는 공통적으로 struct header를 갖게
됩니다. 이것을 union으로 묶어 버리면 한번에 읽을 수 있겠죠.

union P
{
struct A as;
struct B bs;
}

그럼 원하시는데로 한번에 한 structure씩 읽기가 가능해지지만 패킷의 크기가 가장 큰넘으로 동일해셔 패킷량이 는다는 단점이 생기겠죠.

댓글 달기

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