데이터 사이즈를 모를때 수신방법

siba555의 이미지

안녕하세요.
정초부터 질문을 드려 죄송합니다.
클라이언트로부터 xml데이터를 전송받는데 헤더를 정의하지않아 전체 데이터의 사이즈를 알수 없습니다.
그렇다고 버퍼사이즈를 무작정 크게 해놀수도 없고 이경우에 서버에서 recv함수를 어떤식으로 구현을 해야할까요?
통신고수님들의 도움을 기다립니다.^^;;

superkkt의 이미지

파일로 일단 저장을 하실건지 아니면 메모리에만 내용을 유지할건지에 따라 달라질텐데요. 일단 XML이라면 내용이 그리 크지 않을테니 메모리에 유지하는 경우가 많겠죠.

메모리에만 저장한다면 우선 고정된 사이즈의 내부버퍼로 패킷을 수신 합니다. 그리고 수신된 사이즈만큼 동적메모리로 복사(추가)를 하는데 이 과정은 동적메모리를 자동으로 늘려주면서 추가를 하는 함수를 만드시면 됩니다.

아래는 좀 다른 경우에 사용했지만 제가 사용하는 함수입니다. 단, 이 함수는 문자열을 대상으로만 사용 할 수 있습니다. 수신하는 데이터가 바이너리 데이터인 경우에는 사용 할 수 없습니다.

/**
 * str_append - 기존 문자열에 새로운 문자열 추가
 *
 * @parm ptr(IN/OUT): 기존 문자열 포인터
 * @parm str: 추가할 문자열
 * @return: 성공 시 0, 실패 시 -1
 *
 * 기존 문자열이 NULL인 경우 새로운 메모리를 할당하고, NULL이 아닌 경우
 * 새로운 문자열을 추가하기 위한 공간만큼 기존 문자열 메모리를 확장한 후
 * 새로운 문자열을 추가한다.
 */
int
str_append(unsigned char **ptr, const unsigned char *str)
{
    ASSERT(str);
 
    /* +1 is terminating null */
    if (!*ptr)
        *ptr = xcalloc(1, strlen(str) + 1);
    else
        *ptr = xrealloc(*ptr, strlen(*ptr) + strlen(str) + 1);
 
    if (!*ptr)
        return -1;
 
    strcat(*ptr, str);
 
    return 0;
}

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

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

neomark의 이미지

저는 통상 보내고 받는 사이즈가 가변적일 경우,

하나의 data를 보내기 위해 2번의 통신을 합니다.

1. 사이즈
2. data

이런식으로요..

client 수정이 가능하시다면 저런식으로 처리를 하시는 것도 괜찮을 듯 합니다.

다만 주의 하실게, 처음 사이즈 보낼 때 long 변수 등을 보내시면 byte ordering에서 신경을 써야 겠지요...

익명사용자의 이미지

전송에 사용하는 데이터 포맷이 XML이라면, 닫는 root 노드를 찾을때까지 읽은뒤 처리하거나

SAX파서를 이용해서 데이터를 읽으면서 처리를 하는 방법은 어떨까요?

모지리의 이미지

두가지 방법이 있습니다.

1. 특정한 사이즈를 특정한 시간동안 수신한다.

2. 무한정 사이즈를 특정한 시간동안 수신한다.

두가지 모두 수신 길이가 0일때 까지 수신해보시면 전송되는 전체가 되게 됩니다.

익명사용자의 이미지

통신하는 프로토콜상의 데이터 길이를 모르는 경우,
1.통신 데이터를 String으로만 취급하면 특수한 경우를 제외하고는
통신이 어려울 것으로 보입니다.
2. XML 파서를 이용해 데이터의 내용으로 데이터 끝을 추정하여야 합니다.

위 사항 모두 길이 정보 4byte(아닐수도 있지만) 오버헤드의 수백배의 cost가 소요될 것 입니다.

통신 메시지는 length + data 가 최소한의 필수사항일 것 같습니다.

siba555의 이미지

모두 새해복많이 받으세요..

only2sea의 이미지

가능하시다면 어떤 방식으로 어떻게 해결하셨는지도 적어주셨으면 좋겠습니다. 비슷한 문제를 겪는 경우에 참고할 수 있으니까요. KLDP에서는 말머리를 붙이는지 모르겠지만 해결되셨다면 글 제목도 [해결] 같은 것을 붙이시면 더 좋을 것 같아요.

이제는 서명에 무엇을 써야하는지 생각해보자.

댓글 달기

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