[질문] 소켓에서 연결 끊으면 time out

익명 사용자의 이미지

서버 프로그래밍을 해서 서버 띄워놓거
클라이언트로 무쟈게 접속을 시도 햇거든여..
포트 포워딩 처럼 걍 들어오면 다른쪽으로 넘겨주는 역할이구여
근데 netstat -an 치면
211.xxx.xxx.xxx.37417 211.xxx.xxx.xxx.xxx.8787 32119 0
8760 0 TIME_WAIT

이런식으로 타임 아웃이 걸립니다.. 쩌비..
그래서 서버데몬을 잠시 강제 종료 하면 .. 잠시동안
저 타임 아웃이 없어질때까지.. 띄우질 못해엽..
소켓 확실히 닫았구여 close(sock)
클라이언트에서도 잘 닫거...
서버에서도 닫거 쓰레드 죽이거..
후훔.. 왜 그런지 아시면 답변좀 부탁합니다.

익명 사용자의 이미지

서버가 종료되어도 일정시간(보통 45초에서 1분이내...) port가 살아 있는
것처럼 되어있습니다.
그 이유는 아래 두 문서를 참고하세요.(아래문서는 본 게시판에서 검색해서
옮겨만 놨습니다.)

원문
http//www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html
축약(설명)한 게시물
http//kldp.org/script/bbs/read.php?table=qa2&no=3685&o[sc]=c&o[ss]=socket&o[st]=a&o[at]=s&o[sct]=s&o[stt]=s

하지만 다시 서버를 띄워도 될 수 있는 옵션이 있습니다.

int optval =1;
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(optval));

이와 같이 사용하면 port의 TIME_WAIT와는 상관없이 다시 그 포트를 사용
할 수 있게 됩니다.

실질적인 사용예는
(Win32프로그램까지 생각해서 만들어진 소스라 약간 지저분해
보일 수도 있습니다. -))

http//home.t-online.de/home/Andreas.Steinmetz/shared/svsock.html

를 참고하시면 됩니다.
답변을 달기위해서 여기저기 찾다보니 예전에 사용했던 방법이더군요.
덕분에 잊어버렸던 기억을 되찾은 기분입니다. ((감사합니다.)) -)

익명 사용자의 이미지

SO_REUSEADDR 옵션 말고 SO_LINGER 옵션이 있습니다.

SO_REUSEADDR 옵션은 같은 주소를 다시 써도 된다는 소리고
(즉, TIME_WAIT 상태가 유지되도... 그 주소를 이용하겠다는 뜻이고)

SO_LINGER 옵션은 바로 rst 신호를 보내서 TIME_WAIT 상태 없이

접속을 끊어버립니다. 자세한 사용법은 UNIX Network Programming 을

참고하시길... ^^;

그럼 고운 하루...

익명 사용자의 이미지

REUSEADDR을 써도 좋지만 그것은 매우 않좋은거 같습니다.
일단 기존의 에러상황을 무시하는 뜻이니 바람직하지 않죠.

질문하신분의 경우 상태 해결은 간단합니다.

Accept부분에서 close를 곧바로 하지 않으시면 됩니다.

즉, connect한 클라이언트보다 accept된 서버가 먼저 close를 하는 경우

Timeout이 발생됩니다. 이때 이 포트는 다음 검사때까지

사용하기 어려운 부분으로 표시됩니다.

대부분 이런 경우가 발생하는 것을 예상치 못하는데

연결후 마지막 동작을 클라이언트로부터 서버로 1바이트라도 전송하는

동작을 취하면 accept한 서버는 절대로 읽어야 할 데이터가 있기 때문에

먼저 끊지 못하는 방법이 있습니다.

즉, 프로토콜을 정의하실때 이런점은

항시 고려해야 안전한 서버가 되는것이겠죠..

전송할 데이터가 전혀 필요없고 단순히 연결만을 취한다면

REUSEADDR을 사용하는게 좋고요...

댓글 달기

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