[완료] sendto()가 한 번에 보낸 데이터를 recvfrom()으로 받을 때 한 번에 다 받아지는지?

zikpreed의 이미지

UDP 소켓 프로그램에서

sendto()와 recvfrom()으로 데이터를 주고받고 있습니다.

sendto()가 한 번에 보내는 데이터의 길이는 언제나 MTU(보통 1500바이트 정도)를 넘지 않게 프로그램한다면...

sendto()가 한 번에 보낸 데이터를

recvfrom()이 두 번 (또는 그 이상)에 걸쳐 나눠서 받아야 하는 경우도 생기나요?

그러니까, sendto()가 1200바이트를 보냈는데,

받는 쪽에서 recvfrom()을 호출했을 때, 처음에 800 바이트만 받고 리턴하고,

그래서 다시 400 바이트를 가지러 또 가야 하는 경우가 생기는지 궁금한 겁니다.

man 페이지에는

"The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested."

라고 적혀 있네요.

그러니까...

received_size = recvfrom( sock, recv_buf, 1200, 0, (struct sockaddr*)&sender, &sender_size);

처럼 호출해도, 받는 버퍼에 한 바이트가 들어와도 리턴할 수도 있다는 이야기로 들립니다만...

(참고로, 이 라인 앞에 select()를 써서 recvfrom()이 블럭되지 않게는 하고 있습니다.)

테스트를 해 보면 거의 sendto() 한 만큼을 동일하게 recvfrom() 한 번의 호출로 가져오는 것 같긴 합니다.

그렇지 않은 경우도 생기는지...

물론 제대로 다 받아졌는지를 확인하는 작업을 어플리케이션이 해야 한다는 건 알겠는데요...

지금 몇 바이트를 보낼지 예측할 수 없는 상황도 있고 해서...

패킷의 경계선을 찾는 작업을 해서 패킷을 끊어야 하는데, 경계선이 모호하기도 하고...,

오버헤드가 커지는 문제도 있고...

물론 요행을 바라면 안 되긴 하겠지만서도...

순전히 궁금하기도 하고...

혹시 경험 있으신 분?

여러분의 관심과 친절한 답변에 미리 감사드립니다. _(_._)_

gomtos의 이미지

TCP와 다르게 UDP는 보낸만큼 무조건 다 받아요.. 아예 못받거나 그래서 체크썸으로
데이터 검증만 합니다.. 때문에 TCP보다 송수신 효율이 좋지요.. 오버헤드가 없으니..
그러니까 동영상 스트리밍에 많이 쓰입니다..

nthroot의 이미지

말씀하신 내용은 TCP에만 적용되고 UDP에는 적용되지 않습니다. 보낸 만큼 받는 쪽에서 수신을 한번에 해야 합니다.
한 바이트가 들어와도 리턴이 되는건 보낸 UDP 블락의 크기가 한 바이트 일 경우 리턴을 할 것 같네요.
사이즈를 정확히 알수 없으면 UDP 블락의 최대 크기만큼 수신을 하고 기다려도 될 듯 한데요.

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

zikpreed의 이미지

저도 테스트를 해 보니까, 나타나는 현상이 gomtos님, nthroot님 말씀처럼 되는 것 같기는 한데,
TCP에서 프로그램할 때 중간에 끊어지는 걸 감안해서 프로그램하던 게 생각나서요...
혹시나 하고 질문을 올린 건데, 고수님들의 친절한 답변 감사합니다.

댓글 달기

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