패킷의 분할과..재조합..

hongyi의 이미지

패킷을 현재 구조체 형식으로 만들었습니다. 패킷의 구조가

크게 명령어/옵션/데이터 이렇게 크게 3가지로 나누었는데..

데이터부분의 길이를 재서 그 길이를 넘어가면, 데이터부분을 쪼개서

서버로 보내는 프로그램을 작성할 계획입니다. 분할된 패킷들을 받은

서버는 그 패킷들을 다시 하나의 데이터로 조합을 해야 하는데..

이론상으로는 이런 흐름을 갖는 다는 것을 알 수 있으나, 실제 코딩을 어떠

한 식으로 해야할지 감을 못잡겠습니다.. 많은 답변 부탁 드립니다.

albamc의 이미지

IP 의 패킷 재 조합 방식을 참고하시는게 좋을듯합니다...

^^*

hongyi의 이미지

재 조합 방식을...잘 모르겠는데..요..

제가 초보라서요..

좀더 알려주시면 안되겠습니까?

indizarm의 이미지

저같으면 이렇게 하겠는데요

struct hdr
{
int data_size;
char* data;
};

hdr info;

info.data_size = 버퍼의 크기
info.buf = (char*)malloc(버퍼의 크기);

send(,,, (char*) info, 크기);
send(,,, info.buf, info.data_size);

(파라미터 순서 무시)

이렇게 해서 처음에 hdr 타입의 변수를 (char*)로 해서
보내고, 받은 것을 다시 hdr 타입으로 casting하고,
data_size를 보고서 buf를 만들어서, 송신측에서 실제
데이터를 보낼때 받는 형식으로요.

단, 송신측하고 수신측의 아귀가 잘 맞아야하겠죠.

뭐 구조체로 되어 있으면, pack (맞나?) 문제인가 뭔가
생겨서 사이즈에서 조금 손봐줘야할 수 도 있겠지만요.

What a Cool Days!!!

hongyi의 이미지

감사함돠~!!허나...
구조체로 프로그램을 작성해야 하는데..

pack이란 문제가 정확하게 무엇인지..그 문제를

해결하기 위한 방법을..알고 싶습니다...

indizarm의 이미지

구조체 변수가 차지할 공간을 할당하는 방법 정도로
생각하시면 될듯합니다.

struct stct1
{
char ch;
int i;
}

struct stct2
{
char ch1;
char ch2;
int i;
}

구조체 stct1과 stct2가 있을때, 1byte 단위로 차곡차곡
메모리를 할당한다면, 쉽게 생각할 수 있듯 stct1의 크기는
5, stct2의 크기는 6이 되겠죠.

그런데 일반적으로 시스템에서 관리를 효율적으로 하기위해
일반적으로 4bytes를 기준크기로 해서, 메모리 공간을 할당
하죠.
그렇게 되면 stct1과 stct2 모두 크기가 8이 되겠죠.
stct2의 ch1과 ch2는 같은 셀(정확한 용어는 '절대' 아님)에
위치하겠죠. 그래서 stct1의 ch도 4bytes를 stct1의 ch1과
ch2도 4bytes의 공간을 차지하죠.

정확한 내용은 검색을 해보시는 것이 좋을 듯합니다.

그리고 제 생각에는, 그냥 보낼때 이렇게 하면 될듯

send(,,, (char*)데이터, sizeof(데이터의 타입)); 이렇게 하면

될듯합니다. 아닐까요? 테스트는안해봤습니다. -_-;;

What a Cool Days!!!

hongyi의 이미지

제가 C언어를 시작한지 얼마되지 않고 기초가 없어서

엉뚱한 질문을 하더라도..참아주세요...ㅠ.ㅠ

님께서 말씀하시는 바로는 구조체의 변수 크기를 4byte로 지정을 해 놓고

send함수를 이용해서 send(,,,(char*)데이터,sizeof(데이터타입)); 이라

고 하셧는데...데이터 타입에는 구조체가 들어가지 않나요?

그렇게 되면, 긴 데이터를 알아서 4byte로 나눠서 구조체의 변수로 들어가

소켓을 통해 전달이 되는건가요?

indizarm의 이미지

변수에 어떤식으로 메모리를 할당할 것인지 (pack 맞을껍니다.)
에 관한것은 macro등으로 옵션 설정을 바꿀 수 있습니다.

VC++의 경우 1byte packing 하게 하는 macro

#pragma pack( push ) 
#pragma pack( 1 ) 

그러나 손대지 않으시는 것이 우선 정신 건강에 좋을듯하고요
(정신건강은 아니고, 효율이 떨어질 수 있겠죠. 컴퓨터 구조
수업을 들으시면 왜 그런지 아시게 되겠죠.)

Quote:
바로는 구조체의 변수 크기를 4byte로 지정을 해 놓고

=> packing 옵션은 건드리시지 않는 것이 좋을 듯.

어쨌든 계속 말씀드리면

send( ,,, 버퍼, 버퍼의 길이 ) 이정도로 하면 보내는 쪽에서는 버퍼의 길이만큼 버퍼에 있는 내용을 보내겠죠.

send(,,, (char*)데이터, sizeof(데이터의 타입)); sizeof() 연산자는 타입의 크기를 byte단위로 return하니까, 구조체 형태의 '데이터'를 보내는데 무리가 없겠죠.

그리고 send()나 recv()가 어떤식으로 데이터를 보내는지는
우리의 관심밖이죠. 우리는 그냥 '사용할 뿐'

아, 그거는 아시겠죠?

send()는 한 번 호출로 모든 데이터를 NIC의 '버퍼(? 정확한 표현인지..)'
에 쏟아버리고 return하기 때문에, 한 번 호출만으로 만족할 수 있겠지만
recv()는 return 값을 합하면서 loop을 돌면서 계속 받아야 한다는거요.

send : recv = 1 : 多
정도로 생각하시면 될듯.

What a Cool Days!!!

indizarm의 이미지

MSDN의 'send()' 부분입니다. WinSock도 BSD sock을
흉내냈으니까, 참고해도 무방할 듯...

SOCKET은 그냥 'int' 형태의 file descriptor를 생각하시면
되고요. flag는 뭐 man 2 send로 찾아보세요.
(그냥 보내는 거라면 flag는 무시해도 될 듯)
____________________________

send
The send function sends data on a connected socket.

int send(
SOCKET s,
const char* buf,
int len,
int flags
);

Parameters
s - Descriptor identifying a connected socket.
buf - Buffer containing the data to be transmitted.
len - Length of the data in buf, in bytes
flags - Indicator specifying the way in which the call is made.
Return Values
If no error occurs, send returns the total number of bytes sent,

What a Cool Days!!!

confide의 이미지

맨 처음 답장을 이해하시기 위해서는 snort나 TCP/IP stack 등의 소스를 참고하셔야 할듯 합니다. 하지만 초급 수준이라 하셨으니 시간을 많이 소모하는 일이 될수도 있겠네요. 그리고 IP 재조합과 같은 과정이라면 쪼개진 경우와 그렇지 않은 경우를 구분하는 flag, 쪼개진 경우라면 그들간의 순서를 규정짓는 일련 번호를 각각의 패킷에 넣어주어야 겠지요.
후에 이들 패킷들을 수신하는 측은 fragment flag와 일련번호를 기준으로 재조합을 수행해야 하지 않을까 합니다.

하지만 뒤에 답변들을 보면 어차피 socket 함수들이 제공해주는 기능들을 충실히 활용하자는 내용들로 보입니다. 구태여 패킷을 재조합해보고 싶은 마음이 있지 않으시다면 socket 만으로도 얼마든지 이를 해결하실 수 있을것 같네요.

예를 들어서 패킷 사이즈가 얼마인지를 먼저 전송하고 그만큼의 데이터를 송신한다던가, 기타등등 여러가지 방법이 있겠네요. 하지만 이에 대해서는 저도 정.확.히 알고 있지 못해서 :) 위엣 분들 말씀을 참고하시면 될듯 합니다.

indizarm 님이 올려주신 내용을 기준으로 한번 조사를 해 보시면 어떨런지요?

------------------
나는 바보

댓글 달기

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