send() 후 바로 close()하는 경우..

towngo의 이미지

패킷 하나를 send()로 보냈습니다..
그리고 바로 send한 소켓을 close 했습니다..

if(send(sock, &packet, sizeof(packet), MSG_DONTWAIT) < 0) 
{
            // error 처리..
           return 0;
}
close(sock);

이런 구조인데욤..
받는 쪽 - 윈도우입니다 - 에선 close 하기 바로 전에 패킷을 못받네요..
send한것보다 close가 먼저 될수 있나요?
항상 이렇네요.. -_- +

purewell의 이미지

send했다고 해서 바로 보내지지 않습니다.

버퍼에 쌓아두고 버퍼가 차거나 일정 시간이 지나야

실제로 데이타를 보내게 됩니다.

이때 close/closesocket을 하면 ㅡ_-) 버퍼에 있는 녀석을

보내지 않고 바로 소켓 자원을 OS에게 반환해버립니다.

소켓이 닫히기 전에 보내지 않은 데이타를 완전히 보내기 위해서는

shutdown(sockfd, 2)를 해서 graceful close를 해줘야합니다.

그냥 close하기 전에 앞에 shutdown 한 번 해주면 ㅡ_-) 될 수 있습니다.

send하면 바로 보내려면 setsockopt로 TCP_NODELAY 옵션을 줄 수도

있다고 합니다.

또한 LINGER계열 옵션으로 LINGER를 꺼버리면 shutdown해도

graceful close가 되지 않습니다.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

towngo의 이미지

음.. shutdown()두 해 봤는데욤.. 역시나 안돼는군요.. T^T

별다른 sockopt두 준게 없는데.. 말씀하신대로 TCP_NODELAY 을 줘 봐야겠네요.. :)

웅.. linux끼리는 잘 되는뎅.. 왜 윈됴랑 붙기만 하면 문제가 생기는걸까.. -_-+

펑키의 이미지

send() 리턴을 한번 찍어 보시는것은 어떨런지요.? 그리고 윈도우쪽에서도 recv() 리턴을 한번 찍어 보는건 어떨까요.? 구조체로 보내기 하실때는 엔디안 문제도 있지만(이경우는 아닐테구) 조금만 잘못 보내도 중간에 강제로 끊어 버리는것 같더라구요.

제 생각에는 두 함수 모두 보내고 몇바이트가 갔는지 리턴을 찍어 보시는게 빠른 방법일수도 있을거 같아요.

건강하세요.

영의 이미지

 의 이미지

소켓을 close하기 전에, send한 내용이 정말로 수신되었는지 확실하게 할 수 있는 가장 직관적인 방법이 있습니다.

수신측에서 해당 내용을 받은 다음에 회신하게 해서, 송신측에서 이 회신을 확인한 뒤 close하는 것이죠.

사실 TCP 프로토콜 자체가 이러한 Acknowledgement 메커니즘을 포함하고 있으니 중복 투자 같은 느낌이 들긴 합니다만, 그 메커니즘이 어플리케이션에서 접근 가능한 것인지 잘 모르겠네요.

하지만 지금처럼 socket close 직전이라 synchronization이 특히 중요할 때는 해 볼 만 하겠지요.

덧. 2003년 질문이었네요. -_-;;;

댓글 달기

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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 사용할 수 있는 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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]. PHP 소스 코드는 다음과 같이 사용할 수 있습니다: <?php ... ?> 또는 <% ... %>.
  • 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.