안녕하세요 Socket의 Read()옵션 관련 도움좀 부탁드려요

goomba의 이미지

현재 소켓 통신 프로그래밍중입니다.

구조체를 Read하는 프로세스인데,

2가지의 구조체를 Read하는데 문제는 제가 Read를 하는 시점을 알수 없다는겁니다..

Struct aaa
{
int a1;
char a2[4];
} 와

Struct bbb
{
double b1;
char b2[8];
}

이라는 2개의 크기가 다른 구조체가 있는데

한번의 통신마다 n번의 Read를 하는데

n번의 횟수는 알수있는데

매번 aaa와 bbb가 날라오는 순서가 달라서

해당 구조체를 캐치할수가 없네요..

read(sock, &aaa, sizeof(aaa));
read(sock, &bbb, sizeof(bbb));

위와 같이 read를 하고 있는데 어떤 방법을 사용해야

그때그때 날아오는 구조체를 Read할수있나요?

고수님들의 도움 부탁드립니다.

jick의 이미지

구조체 시작부분에 특정 byte를 넣으세요. 예를 들면 aaa는 반드시 첨에 0x01로 시작하고 bbb는 0x02로 시작한다든지...
그러면 한 바이트를 읽으면 다음에 뭘 읽을지 알 수 있습니다.

* 뭐 그렇다고 "한 바이트를 read하고 if해서 원하는 크기만큼 read" 식으로 짜면 회사에선 매우 눈총받겠지만 학교 과제 수준이라면 별 상관없습니다.

* 아 read할 때도 필요한 byte만큼 다 읽었는지 확인해서 아니면 루프 도는 건 하셨죠?

goomba의 이미지

답글 감사합니다!

답글 보고 고민하던중에 구조체 내에 공통 헤더가 있었네요

헤더 내에는 메세지 타입이랑 메세지 크기가 들어가있구요..

좋은 하루 보내세요!

shint의 이미지

//전송
a = "안녕";
send(a);

b = "하세요";
send(b);

//받기
read(c)
printf(c)

read(c)
printf(c)
녕하세요

그럼 우리는
이걸 받아서 더해줍니다.

안 + 녕하세요
날아오는 데이터의 길이가 다르고. 읽어들인 길이가 다르지만. 붙이니까. 잘 보입니다.

//
A,header = 0x11;
A.str = "안녕";
A.len = 4;

B.header = 0x12;
B.str = "하세요";
B.len = 6;

read(c);
read(c);

d += c + c;
안 + 녕하세요.

A의 첫 바이트를 사용자가 만든 프로토콜 헤더와 비교합니다.
같은게 있으면. 그것의 길이 만큼 잘라 냅니다.

만약 없다면. 다음 배열로 넘어가며. 확인하거나. 잘못된 패킷을 버립니다.

그럼.
d 는 안녕과 하세요로 나누어지게 됩니다.

그것을 구조체와 비교하시면 됩니다.

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

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

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

댓글 달기

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