서버와 클라이언트간에 주고 받는 패킷을 체계적이면서 유연하게 관리할 수 있는 방법이 있는지 궁금합니다.

vudghkzm의 이미지

서버와 클라이언트간에 주고 받는 패킷을 쉽고 유연하게 관리할 수 있는 방법이 있는지 알고 싶습니다.

예를 들어, c 에서 소켓으로 패킷을 보낼때 기본적으로 아래와 같이 합니다.

int  maxPacketLen = 64;
char packet[maxPacketLen];
int  packetLen = 0;
 
packetLen += sprintf("This is a example packet", packet + packetLen, maxPacketLen - packetLen);
packetLen += sprintf("blar ~ blar~", packet + packetLen, maxPacketLen - packetLen);
...
 
write(sock, packet, packetLen);
...

근데 위와 같이 패킷을 주고 받으면, 나중에 패킷이 확장되거나 수정된 후에는 패킷을 주고 받고 파싱하는 부분을 수정하는데 많은 cost가 들어가야 합니다.

그래서 패킷을 클래스와 1:1 대응시켜서 패킷을 주고 받고 파싱하는 방법이 있는지 궁금합니다.
예를 들어, class Packet 이란 클래스가 있고, 이 객체에 각종 set 메쏘드, get 메쏘드 등이 있어서 패킷에 값을 설정하고, 읽어온 패킷에서 원하는 값을 쉽게 얻고... 또한 패킷을 주고 받을 때에 대비해서 read, write 메쏘드가 있고... 등등
이와 같은 것을 하면 패킷을 좀 더 구조적이고 유연하게 관리할 수 있을 거 같습니다만.. 실제 이와 같은 방법을 제공하는 라이브러리나 프레임워크가 잇는지 궁금합니다.

굳이 위와 같은 방법이 아니더라도 서버<->클라이언트 간의 통신에서 패킷관리를 체계적이고 유연하게 관리할 수 있는 방법이 있다면 소개 부탁드립니다.

thruthesky의 이미지


안녕하세요.

패킷을 전송할 때에 구조체를 직접 전송하고 받고 할 수 있습니다. 물론 클래스를 그대로 전송하고 클래스를 그대로 받을 수도 있습니다.

char packet[maxPacketLen]; 와 같이 하지 마시고 아래와 같이 구조체로 해 놓고 패킷을 전송할 때에 아예 구조체를 패킷으로 만들어서 전달하면 어떨까요?

struct .. {
unsigned char version;
char header[256];
char data[1024];
int abc;
int etc .... ;
} PACKET;

수신할때에 위 구조체에 맞게 값을 얻어와서 구조체에 수신한 값을 집어 넣어서 사용을 하면 좋습니다.

제 경험으로는 위와 같이 작업을 할 때, 패킷의 구조가 변해야할 때, 상당히 자유로웠습니다. 패킷에 구조의 버젼을 두고 버젼바다 따로 처리를 할 수 있구요...

라이브러리나 프레임은... 코드프로젝트나 코드구루에서 충분히 찾을 수 있을 것입니다.

프레임워크로는... 기억이 가물 가물한데 ... 화상 통신을 위한 UDP 의 H.323 쪽의 라이브러리가 있을 것입니다. 참고하시면 도움이 될지도...

---------------- --------------------------
전신권태,피부발진,기미,주근깨,여드름 증상 보유

전신권태,피부발진,기미,주근깨,여드름 증상 보유

댓글 달기

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