소켓 프로그램 데이터 전송 질문

yeilho의 이미지

소켓 프로그램하는데 궁금한게 있어서 글을 올립니다.

제가 보내려는 전문이

헤더길이 헤더 본문길이 본문

으로 구성되어 있는경우에, 이것을 어떻게 보내야 될지 조언을 구하고자 글을 올립니다.

예를 들어 아래 같이 전문이 구성 될 수 있을것 같습니다.

헤더길이: 5
헤더: AAAAA
본문길이: 10
본문: AAAAABBBBB

5AAAAA10AAAAABBBBB

문제는 본문의 길이가 가변이라서 어레이로 길이를 잡을수 없어서 포인터를 사용해야 할것 같은데 어떻게 해야 좋을까요?

받는 쪽에서 한번에 1024 바이트 이상 받을수 없다보니 적당한 방법이 떠오르지 않네요.

물론 헤더길이 따로 헤더 따로 필드별로 계속해서 보내고, 본문은 1024씩 나누어서 보낼수도 있겠지만 이것이 올바른 방법이 아닌것 같아서 고수님들의 의견을 구하고자 합니다.

읽어 주셔서 감사드립니다.

ILHO

ssehoony의 이미지

무슨 소켓을 사용하시는건가요? "1024 이상 못 받는다"고 하시는 궁금하군요. (TCP를 사용 못 하는 상황인가요?)

위에 생각하시는 구조를 다시 한번 감싸는 프로토콜을 하나 작성하세요.
[전체 길이 + 현재 데이터가 전체 데이터중 어디에 해당하는지 offset + 현재 패킷의 길이 + 실제 데이터]
이렇게 보낸 후 받은 쪽에서 재조립을 하세요.

ㅡ,.ㅡ;;의 이미지

본문만 가변이라면 본문의 길이를 헤더에 본문의 길이를 넣으세요
그리고 본문도 일정길이만큼 쪼개 보내는것이 좋으며 쪼개진뒷단에는 헤더를 붙일필요는 없겠죠.
물론 처음엔 헤더만큼의 고정길이를 읽으시고 헤더에나오는 본문의 길이만큼 읽되 maximum을정하고 보다큰것은 여러번에 걸쳐 읽으시면됩니다.

만일 헤더도 가변이라면 통신자체를위한 헤더를 덧붙이는게 좋을듯합니다.


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

익명 사용자의 이미지

ssehoony wrote:
무슨 소켓을 사용하시는건가요? "1024 이상 못 받는다"고 하시는 궁금하군요. (TCP를 사용 못 하는 상황인가요?)

위에 생각하시는 구조를 다시 한번 감싸는 프로토콜을 하나 작성하세요.
[전체 길이 + 현재 데이터가 전체 데이터중 어디에 해당하는지 offset + 현재 패킷의 길이 + 실제 데이터]
이렇게 보낸 후 받은 쪽에서 재조립을 하세요.

이런 방법이 널리 사용되며, 제가 만들어도 이렇게 만들겠군요.
이미 몇몇 프로젝트에서 이렇게 만든 라이브러리를 사용했습니다.
매번 새로 만드니(해당 사 저작권소유) 포맷이나 핸들링 방식은 다소 틀려지지만 대체적으로는 이 방법을 저도 권고합니다.

참고로, MSN의 P2P파일전송도 이런 식으로 되어있습니다.(물론, 실제 프로토콜은 보다 복잡합니다)

익명 사용자의 이미지

여러 답변 주셔서 감사합니다.

UDP를 사용해야 되는 상황입니다.

받는쪽에서 한번에 받는 버퍼 사이즈를 1024로 고정해 놓고, 헤더의 길이도 가변입니다.

많은 분들이 의견을 주셨는데, 염치 불구 하고 조금 상세히 설명 부탁드릴께요.

감사합니다.

ILHO

댓글 달기

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