recvfrom()함수와 read()함수

Leejaymin의 이미지

안녕하세요

이번에 UDP를 이용해서 신뢰성을 보장하는 소켓통신을 구현하고잇는데요

클라이언트에서는 커넥션을 해서

read write 함수를 사용하고있는데

서버쪽에는 그게안되서

recvfrom() , sendto()를 사용하고있습니다.

근대 여기서 문제는

read 함수는 서버쪽에서 sendto()를 하지않으면 대기상태에 있는데

recvfrom()이 함수는 맨처음에는 대기상태에있다가
클라이언트에서 write하면 수행되더니
2번째부터는 클라이언트의 write가 없어도
게속 수행이되서 무한루프에 빠집니다.

버그과정 >

클라이언트 write 4바이트 전송

서버 recvfrom()으로 4바이트 수신 (받은크기 4라고 나옴)
서버 recvfrom() 계속해서 4바이트 수신 (받은크기 4라고나옴)
..
..
이런식으로 그냥 계속 받아집니다. 보낸건 1번인데...

recvfrom()에 인자로들어간 buf의 값은

test 라는 글자 맨처음에는 제대로 들어갔다가
recvfrom() 2번째부터 글자가 깨집니다.

제가 코딩과정중에 문제가 있어서 그런건지
아니면 recvfrom()이 read와 뭔가 많이 달라서 이러는건지 잘 모르겠습니다.

혹시 recvfrom()을 사용하면 이런문제가 발생하기 때문에 뭐 해줘야되는게 있는건가요?

제발 도와주세요 ㅜㅜ

감사합니다.

terzeron의 이미지

UDP도 신뢰성을 보장하려면, TCP처럼 flow control과 congestion control을 구현해줘야 합니다.
congestion control은 그렇다쳐도 flow control은 되어야죠.
순서대로 보내고 받고 하는 메커니즘을 애플리케이션이 책임지고 제대로 구현해줘야 합니다.

그게 어렵다면 한 메시지에 대해서 한 번의 ACK 메시지를 보내주는 방식으로 동기화를
해주는 게 가장 간단합니다.

read/write와 sendto/recvfrom을 섞어서 사용하는 것은 그다지 추천하고 싶지 않네요.
일단 TCP/UDP에 대해서 제대로 이해하고 있는 사람도 그렇게 섞어쓰면 헷갈리고 실수할 수 밖에 없거든요.

sendto/recvfrom은 수행에 대한 성공/실패를 애플리케이션이 각각 처리해줘야 합니다. 반복적으로 부르면 어느 순간에는 성공할 거고, 어느 순간에는 실패할 겁니다. CPU 리소스 차원에서는 손해보는 짓이죠. 앞서 말한 것처럼 송신자와 수신자가 짝 맞춰서 메시지를 보내고 받는 방식으로 구현하셔야 안전하게 동작할 겁니다.

댓글 달기

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