네트워크 프로그래밍에서 전송 싸이즈에 대해서...

zeshai의 이미지

안녕하세요. 간만에 글을 올리네요.

네트워크 프로그래밍을 많이 안짜봐서 이번에 좀 고생했는데.

그냥 간단하게 제가 구성한 structure를 보내고 받을때...

그 크기가 한 600바이트가 됩니다.

다른 작업없이 그냥 쏘고, 받고, 쏘고 받고 입니다.

아, 리눅스에서 작업했습니다.

그런데 제대로 전송되지가 않더라구요.

자세히 보니깐, 600바이트 한번가고 또 600바이트 한번 가는게 아니고...

만약 600바이트를 세번 보낸다고 가정하면,

600+600+300 (나머지 300바이트는 짤림) 이게 한번에 날아갑니다.

그리고 받는 쪽에서는 1500들어온것 중에서 600, 600, 300 이렇게 채우게 되구요.

MTU가 1500byte 이니 그때문에 걸리는것 같은데

왜 바로바로 날리지 않고, 저렇게 모았다가 쏩니까?

만약 10,000바이트 정도의 파일을 읽어서 보낸다고 하면...

어떻게 보내야하죠?

급한과제라... 그냥 나머지는 garbage로 채워서 1500맞추고

받는쪽에서도 600바이트 이외의 것은 무시하고... 내긴 냈습니다만...

뭐... tcp가 어쩌고 저쩌고하는거는 농담따먹기네요.

안해보니깐 고작 10,000바이트 파일도 전송 못하겠습니다.

raw 소켓을 열지 않고 바로바로 전송하지 못할리는 없을것 같은데요...

궁금하네요... 왜 그런지도 해결법도... 좀.... 부탁드립니다.

yeppiguy의 이미지

int sockfd;

/* tcp socket open */
.......

int optval = 1;

setsockopt(sockfd,IPPROTO_TCP,TCP_NODELAY,&optval,sizeof(optval));

한번 해 보세요...

bugiii의 이미지

그 옵션을 써도 뭉쳐 가거나 잘려서 가는 것을 방지할 수 없습니다.

출발지에서 아무리 잘 보낸다고 하더라도 받는 곳까지 가는 동안 수많은 라우터나 장비들을 거쳐가기 때문에 언제든지 분할/합침이 일어날 수 있습니다. 그리고 운좋게 제대로 도착했다고 하더라도 받는 쪽의 사정으로 합침이나 분할이 일어날 가능성도 충분히 있습니다.

이런 상황을 대비해서 자신만의 패킷구조를 만드시고 (예들들면, 데이터 안에서 안쓰거나 특별한 탈출코드로 패킷의 마지막을 나타내거나 크기 + 내용으로 보내거나 등) 정해진 패킷을 주고 받는 것이 올바른 방법이라고 생각합니다.

만약 주고받는 데이터 패킷의 크기가 일정하다면 한가지 옵션이 있습니다만... 이것은 조금 사용이 주저되는 것이라... recv 함수의 MSG_WAITALL 옵션으로 원하시는 기능을 사용할 수 있지만, 이것도 종료, 시그널 상황처리가 필요하고 데이터의 패킷이 추가된다면 (크기가 다른) 조금 어려운 상황이 될 것입니다.

댓글 달기

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