recv()함수에 대한 질문요?

skylandi의 이미지

서버에서 send()함수로 클라이언트에게 메세지를 보냅니다.
recv()함수로 메세지를 받을때
한번에 메세지가 올 경우가 생기고
두번을 통해서 메세지가 올 경우가 생기게 됩니다.
TCP 특성상 그렇다고 하던데...

만약에 100바이트를 보낸다고 가정하에
50바이트를 받아왓다고 하면 나머지 50바이트를 받아와야 하는데
재전송 하면 50바이트가 아깝운데...
나머지 50바이트를 이어서 받아올수 잇는 방법은 어떻게 해야 하는지요?
아무런 개념이 없어서 ㅠ

즐거운 하루되시길

yhjj777의 이미지

skylandi wrote:

만약에 100바이트를 보낸다고 가정하에
50바이트를 받아왓다고 하면 나머지 50바이트를 받아와야 하는데
재전송 하면 50바이트가 아깝운데...
나머지 50바이트를 이어서 받아올수 잇는 방법은 어떻게 해야 하는지요?
아무런 개념이 없어서 ㅠ

size = recv( sock, buf, 100, 0 );
이렇게 recv를 호출하였는데 100바이트보다 적게 받았을 경우
버퍼의 포인터를 받은 만큼 이동시켜준 다음..
buf += size
덜 받은 만큼만 recv를 해주시면 됩니다..
recv( sock, buf, 100 - size, 0 );

mangg의 이미지

recv flag 중...
MSG_WAITWALL 쓰면 되지 않나요??

recv(sock , buf, 1000, MSG_WAITWALL); 이라쓰면
recv함수에서 1000바이트때까지 기다리는거라고 알고 있는데

제말이 틀렸다면
고수분들의 하해와 같은 감언을 주셨으면 합니다.

-------------------
나는 Copy&Paster 이다. 나의 화려한 기술 조합에 모두들 나를 두려워 한다. 나도 코드 Maker 이고 싶다.

김충길의 이미지

보통은 저런 문제 때문에 recv를 사용하는 상위 함수를 만들어서
그걸 호출합니다.

대게 길이+길이만큼의 데이타 형태로 메시지를 구성하고
길이필드는 고정사이즈 대게 4바이트 network odering으로 구성하고
길이필드에서 명시된 길이만큼 데이타를 읽는 형태입니다.

헌데 질문주시분은 그런것이 아니라 그냥 고정 100트를 사용하시나 보군요

for (readed = 0; readed <= toread; ) {
     n = recv (fd, buf + readed, toread - readed,  ...);
     if (n > 0) readed += n;
     else if (n == 0) { /* connection closed */ }
     else { /* error handling */ }
}

return readed;

요ㅤㄹㅕㅎ게 많이 하죠.

screen + vim + ctags 좋아요~

펑키의 이미지

oops

통신 프로그램에서 단지 send/recv만 사용하는것은 가끔 위험할때가 생깁니다. 그래서 몇가지 조합해서 사용하는데 그중 몇가지를 생각해볼수 있는데 먼저 가정을 해보죠.

1. send/recv는 모두 전송된/받은 양만큼 사이즈를 리턴 해준다.
2. send/recv는 보내거나 받을 양이 잘못될 경우 잘못하면 무한 블럭에 걸린다.
3. send/recv는 보내거나 받는곳의 디스크립터를 상실할 경우 SIGPIPE에 걸려서 프로그램이 강제 종료될수가 있다.

대충 이런정도인데요.

1번의 경우를 착안해서 send/recv로 별도의 프로그램을 만드시는것이 좋습니다. 즉, 내가 받아야할 사이즈가 얼마인데 현재 얼마 받았으니깐 받아야할 사이즈가 일치 할때 까지 LOOP을 돌려 본다.

2. 번의 경우 블락에 걸렸을때(대표적으로 RECV에서) 대처하는 방법인데 가장 손쉬운 방법은 SELECT를 사용해서 타임아웃을 주는 것입니다.

3.번의 경우 가장 쉽고 가장 정확한 방법은 SIGPIPE 시그널을 무시하게 만들어 주는것입니다.

1번의 예는 다른분이 올려 주신것을 확인해보세요.

즐거운 하루 되세요.

댓글 달기

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