linux에서 accept 함수 에러 핸들링

익명 사용자의 이미지

readhat 7.3의 accept 맨페이지에 다음과 같은 내용이 있습니다.

에러 HANDLING
Linux accept 는 accept의 에러 코드때문에 새 소켓에 이미 미결인 네트웍 에러를
전달한다. 이러한 행동은 BSD 소켓 수행과는 다르다. 신뢰적인 작동을 위해 응용
프로그램은 accept 후에 프로토콜에 정의된 네트웍 에러들을 검사해야 한다. 그리고
재시도에 의해 EAGAIN같은 에러를 처리해야 한다. TCP/IP의 경우, 이것들은 ENETDOWN,
EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, 그리고 ENETUN-
REACH 이다.

위에 의미가 정확이 이해가 안되네요. -p
리눅스에서는 새로운 소켓이 제대로 생성이 되더라도 언급된 에러를 확인하라는 뜻인가요?
아니면, 현재 반환되는 에러는 이전에 발생한 에러라는 뜻인가요?
원문을 보니 'already-pending network errors'라고 되어 있어서 이전에 발생한 에러를
말하는것 같다고 생각을 하고 있습니다 -.-;
이 경우 에러 처리를 어떻게 해야 할까요?

익명 사용자의 이미지

원문에 보니까 이렇게 나와있네여...

treat them like EAGAIN by retrying.

EAGAIN 경우와 같이 재시도 하라고 되어있네여.

다시 accept() 부르심 되겠네여.

그리고, 이전에 발생했던 오류(아마 넷웍구현커널에서 발생하지 않았을까
요?)가 accept() 호출할 때에 리턴된다는 소리구여.

제 생각에는 소켓이 정상적으로 생성되었다면 EOPNOTSUPP 같은 에러는 발
생할 것 같지 않은데요...

그리고 혹시나 accept()를 호출하기 전에 상대방이 connect()했다가
연결을 끊는 경우에 위와 같은 오류가 발생하지 않을까 테스트 해 봤거든
요.
bind, listen()까지만 해 놓고 한 10초간 sleep 상태로 두어서
accept()를 안 하고 있고, 상대방에서는 이쪽 서버에 연결을 했다가
accept()가 불리기 전에 곧바로 끊고요..

이 경우에도 accept()가 정상적으로 수행이 되네요. 아마 read()하면
곧바로 0이 리턴되겠지만서도요..

혹시 이런 경우는 어떨까요?
상대방에서 TCP연결 시도를 했고, 이쪽에서 SYN을 날렸는데, 이것이
상대방에 도착을 안한거예요. TCP 설정의 타임아웃때까지요.
그래서 TCP 커널에서는 해당 연결에 대해서 TIMEDOUT을 내든지..
아니면 HOSTUNREACH를 내든지여... 아니면 그쪽 주소로 라우팅할 수
없는 곳에서 연결시도가 있는 경우(이런 경우가 있을까여?)에요..
이런 처리는 커널(음... 커널에서 되는지 모듈에서 되는지 정확한 용어를
모르겠지만, 암튼 사용자의 응용프로그램에서 하는 처리는 아니겠죠?)에서
되고, accept()가 불리기 전에 수행이 되겠죠.
에러가 발생한 상태가 되겠고요.. (pending된 에러가 있는 상태)
이때 사용자가 드뎌 accept()를 부르면 이전에 발생되었던 에러가
accept()시에 errno에 설정된다는 뜻인 듯 한데여...

뭐 대부분의 경우에는 다시 accept()를 부르심 될 것 같아여..

EOPNOTSUPP 는 아마 소스코드가 잘못됐을 가능성이 많을것 같고요..
EPROTO는 endpoint에서 프로토콜에서 회복하기 어려운 에러가 발생했을
때 난다네여. 그리고 몇몇 구현의 경우에서는 연결이 accept()되기 전에
reset되는 경우에도 발생한다고 하고요.
http//www.unixguide.net/network/socketfaq/2.10.shtml
뭐 이 경우도 다시 accept() 하면 될 것같구여..

ENOPROTOOPT 프로토콜이 지원안된다든지 getsockopt()나 setsockopt()에
서 잘못된 옵션이나 잘못된 레벨을 지정했을 때 나온다고 하는데... 흠..
accept()와는 무슨 관계가 있을려나 모르겠네여...
혹 상대방에서 소켓옵션을 설정하다가 에러가 나는 경우일려나여?
이 경우에는 연결이 해제가 되나 모르겠네여...

참고서적이 옆에 없어서리....
accept()와 관련되어서는 이 경우도 다시 accept()를 수행하면 될 듯 하고
요, 다른 경우에는 넷웍 모듈이라든지 소스코드가 제대로 됐는지를 보면
될 듯 한데여...

쩝쩝...

댓글 달기

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