send()함수의 에러처리가 궁금합니다.

ctcquatre의 이미지

recv같은 경우는

if((recvSize=recv(sock,buffer,packetSize - totalRecvSize,0)) <= 0)
		{
			 if(recvSize == -1 && errno==EWOULDBLOCK)
				 return 0;
			 else 
				 return -1;
		}

위와 같이 에러처리를 하고 있습니다.
물론 소켓은 넌블록 소켓입니다.

recv의 반환값이 0이면 client측에서 연결을 끊은것이고.
-1이면 에러 이 두경우다 close(clientSock)를 호출합니다.

다만 errno가 ewouldblock으로 설정되면 close를 하지 않습니다.

근데 send의 경우 recv와 리턴값이 거의 동등하다고 책이나 문서에
나와있는데.

대략적으로 감이 잡히질 안습니다.
0,-1이면 close시키고, ewouldblock으로 errono가 설정될때
close시키지 않고 이렇게 하는가요?

send의 경우 어떤 에러처리가 있고, 어떻게 해야하는지 궁금합니다.
SIGPIPE의 경우는 send함수의 flag인자에 MSG_NOSIGNAL를
넣어주는걸로 했습니다.

조언 부탁드립니다.

aqwerf의 이미지

검색을 해보면 관련된 많은 답변을 찾을 수 있습니다.

http://bbs.kldp.org/viewtopic.php?t=42179

ctcquatre의 이미지

물론 질문 올리기전에 검색을 했었습니다.
다만 이론적인 설명들이 대부분이라 이렇게 질문을 드립니다.

send의 경우 EWOULDBLOCK의 값이 더이상 버퍼에 쓸수 없다를
뜯하는것 같고,이 이외에 send가 발생시킬수 있는 오류는 SIGPIPE 밖에 모르겠습니다.

또한 send가 0을 리턴하면?
read가 0을 리턴하면 종단에서 연결을 끊었다는 소리인데.

send가 0을 리턴하면 어떤의미를 가지는지요?
이말은 read와 send의 반환값이 같다는 문서나,책을 보고
생각한건데.. 흠.. send의 0의 리턴은 데이터를 하나도
보내지 못했다는 뜻..과 헷갈립니다.

일질적으로 현업에 종사하시는분들은 네트워크프로그래밍할때.

어떤 에러처리를 염두해 두는지 궁금합니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

happycat의 이미지

네.. 잘 처리하신 것 같고요. 추가적으로 EINTR을 처리해 주시면 됩니다.

제가 작성했던 코드를 참고로 보여드리면..

        if (recvLen < 0)
            if (errno == EWOULDBLOCK || errno == EINTR)
                break;
            else
                return -1;
        else if (recvLen == 0) //socket closed
            return -1;

        if (sent < 0)
            if (errno == EWOULDBLOCK || errno == EINTR)
                return 0;
            else
                return -1;
        else if (sent == 0)
            return -1;

send나 recv가 0을 리턴하면 상대방쪽에서 FIN이나 RST를 보냈다는 말입니다. 즉, 소켓 연결이 끊어진 것이니 더 처리할 필요가 없지요..

더 이상 보낼 수 없어서 0이 나오는 경우는 없습니다. non-blocking socket의 경우 EWOULDBOLCK이 리턴되고 blocking socket의 경우 block하고 버퍼가 비워질 때 까지 기다리고 있겠죠.

EINTR은 인터럽트가 발생하여 send나 recv가 빠져나온 경우입니다. BSD계열 OS에서는 EINTR로 빠져나오지 않고 자동으로 인터럽트 처리 후 send나 recv를 수행한다고 UNP에서 본 기억이 나는데, portability를 위해 처리해 주는 쪽이 나을 것입니다.. 한 줄 더 들어간다고 큰 차이가 나는 것도 아니니까요 ^^;

답변이 되었는지 모르겠습니다.

kicom95의 이미지

/*
When writing onto a connection-oriented socket that has been shut down (by the local
or the remote end) SIGPIPE is sent to the writing process and EPIPE is returned. The
signal is not sent when the write call specified the MSG_NOSIGNAL flag.
*/

라는 문구를 찾았습니다만... 도움 될련지....

참 그리고 return 0 일때와 return -1 일때 둘다 close 하는게 정석 아닌지요 ?

가자 해외로 ~ .. 돈 벌러.

happycat의 이미지

SIGPIPE는 ignore해 버리시면 되고요.. (ctcquatre님도 이미 처리하셨다고 했죠)

0, -1 둘 다 close하는 게 정석입니다만 interrupt에 의한 것이나 non-blocking socket에서의 EWOULDBLOCK은 죽여버리면 안되겠죠..

ctcquatre의 이미지

모두들 감사합니다.

좋은 참고가 됐습니다.

미소가 머금어지는 저녁 보내시길 바랍니다. :)

아.. 조금 더 추가질문 드릴께있는데...

non-block의 경우 송신버퍼가 가득차서
EWOULDBLOCK이 나오면..

tryAgain변수를 써서 3번정도 더 시도 하게 했는데..

ㅎㅎ 확신도 없어 저런 코드를 넣었습니다.

if(sendSize==-1 && errno==EWOULDBLOCK)
			{
				ErrorHandle(ERROR_PRINT,"Send EWOULDBLOCK");  //  test code
				if(tryAgain<3)
					tryAgain++;
				else
					return 0;
			}

뭐 이런 코드지요.

이럴때 tryAgain의 효과를 볼수있는지 궁금합니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

happycat의 이미지

아마 저 코드로는 효과를 보기 힘드실 겁니다..

싱글 스레드를 쓰신다면 저 부분은 버퍼가 비워지기 전에 후다닥 끝나버릴 가능성이 높습니다.

멀티 쓰레드라면 sleep 등으로 잠시 잠재워두면 효과가 있겠지만 비효율적이죠.

select나 kqueue, epoll등을 사용하시고 write event를 기다리시는 것이 좋겠습니다.

ctcquatre의 이미지

흠 그렇군요.. write event 그생각을 못했네요.

현제 epoll을 사용중입니다.
write event라 함은 EPOLLOUT 이벤트를 말씀하시는것 같네요.

답변 감사드립니다. ^^ 많은 도움되었습니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

댓글 달기

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