소켓 통신에서요...

hohory의 이미지

TCP 통신에서는,
데이터를 peer host로 전송하고 난 이후,
peer host로부터 패킷을 잘 받았다는 ack를 받아야,
데이터 전송이 성공한 것으로 되는데요...

그렇다면,
blocking 소켓을 이용하여 send 함수를 호출하였을때,
send 함수가 패킷 전송 성공을 리턴하는 시점이,
TCP socket send buffer에 packet data를 적재하는 시점에 리턴되나요?
아니면 packet을 실제로 send 하게 되는 시점에 리턴되나요?(ack 받지 않은 상태)
아니면 packet을 실제로 send하고 그에 대한 ack를 받은 시점에 리턴되나요?

첫번째 궁금한 점이 이와 같구요.

두번째로 궁금한 점은 다음과 같습니다.

non-blocking socket을 통해서 packet을 전송하기 위해,
send 함수를 호출하였을때,
성공으로 리턴되는 경우는 어떤 경우인지요?
단지 tcp socket send buffer에 packet data를 적재하는 시점에 성공이 리턴되나요?
아니면 실제로 packet 전송이 되면 성공이 리턴되나요?(ack 받지 않은 상태)
아니면 실제로 packet 전송한 것에 대한 ack를 받은 시점에 리턴되나요?

성공이 리턴되지 않고, 에러가 리턴되었을때,
에러값이 EWOULDBLOCK이면,
select로 write할수 있는 상태를 기다렸다가,
다시 send를 해야 하는 건가요?
아니면, EWOULDBLOCK이 되더라도,
패킷이 tcp send buffer에 쌓여 있기 때문에,
자동으로 send가 되면서 write 할수 있는 상태가 되는건가요?

우매한 제게 가르침을 주시면 감사하겠습니다.
그럼 수고하세요~

ps. 새해 인사도 함께 드립니다^^
새해 복 많이 받으세요~ ^_^

sunyzero의 이미지

send() 의 blocking mode 에서 성공으로 리턴되는 것은 socket buffer 에 copy 가 끝난 것을 의미합니다.

EWOULDBLOCK나 EAGAIN 은 넌블럭킹에서 실패한 것입니다. 대부분 버퍼 공간이 없는 경우입니다. 당연히 재전송을 해줘야 합니다.

넌블럭킹 모드에서 많이 실수하시는게 성공시 리턴값의 검사인데, 블럭킹 모드와 달리 넌블럭킹은 일부만 리턴되는 경우도 있씁니다. 예를 들어 전송요청한 버퍼의 데이터가 1000바이트여도 500만 리턴되는 경우가 있다는 것이죠. 따라서 리턴값이 양수여도 항상 검사해야 합니다.

========================================
* The truth will set you free.

댓글 달기

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