TCP 연결 시, client에서 서버 종료를 어떻게 감지하나요?

hahaite의 이미지

안녕하세요.

리눅스에서 두 프로세스 간 TCP로 연결하여 데이터를 주고 받는 걸 짜고 있습니다.
정보 문화사의 linux Programming (3판, Neil Mathew 저) 의 소켓 챕터를 참고하고 있구요.

서버 쪽은 select() 함수를 이용해,
- 클라이언트가 연결을 시도함.
- 클라이언트가 데이터를 전송함.
- 클라이언트가 연결을 종료함. (클라이언트 강제종료 포함.)

모두 잘 인지하는 것을 확인하였습니다.

문제는 클라이언트 쪽인데요.
클라이언트 단에서 서버가 종료 (강제종료) 됨을 어떤식으로 알 수 있나요?

주기적으로 서버랑 통신해서 상태를 확인하는 방법이 최선인가요?
(이 경우 체크하는 thread와 데이터 수신 thread를 둘텐데,
이게 효율적인 방법인지도 모르겠습니다.)

고수님들의 조언 부탁드립니다.

감사합니다.

음의 이미지

select 함수 event 발생시 read 하면 0 가 읽혀질 거에요.

hahaite의 이미지

ㅎㅎ 왜 select() 호출 안되나 했더니 FD_SET()으로 등록을 안했네요.
도움 감사합니다. ^^

^^

jic5760의 이미지

recv을 호출해도 크기 0을 출력합니다.
그런데 실제로 프로그램이 돌아가다 보면 랜선이 뽑히던지 예기지 않게(close handshaking없이)연결이 끊기는 경우가 있는데 이런건 이런식으로 해결 못하고 주기적으로 ping패킷을 만들어 날리던지 해서 감지해야 합니다.

hahaite의 이미지

지금 select() 함수로 대체해 보고 있는데요.
최악의 경우 알려주신대로 ping 을 때리던지 해야겠네요.
도움 감사합니다. ^^

^^

jw8704의 이미지

책에있는건 정상적인 경우를 가정했을때의 상대편 접속종료를 처리하는 루틴이 대부분이구요
종료는 정상적인 종료,비정상적인 종료 이렇게 2가지로 나뉘고 비정상적인 종료가 되는 경우는 매우 다양합니다.
예를들면 프로그램이 돌아가고있는데 디바이스 전원이 갑자기 꺼진다던지, 배터리가 갑자기 분리된다던지 하는경우입니다.
이런경우에는 시간이 충분히 지나면 종료이벤트가 날아가기는 하지만 , 언제 종료이벤트가 날아갈지 정확히 알수가없고 종료를 알기까지 오래걸리는 경우가 많습니다.

그래서 보통 Heartbit 라고해서 살아있는지 체크하는 알고리즘을 따로 구현하게됩니다.

근데 이 Heartbit 를 어떻게 짜느냐는 또 프로그램 특성, 업체별로 다양하게 존재합니다.

보통 기준은 상대디바이스의 정상,비정상 적인 종료를 얼마나 빠르고 정확하게 감지하냐 이고 , 그럼에도 디바이스와 네트워크에 무리를 주지않는 그런 알고리즘을 계획하게됩니다.

Heartbit 를 위한 스레드를 따로 생성하는것에서부터 , 자식 프로세스를 이용할수도있고 , 스레드 , 자식 프로세스 같은 무거운 방식이아닌 좀더 light 한 방법을 이용할수도있겟죠..

아무튼 말씀하신 상대디바이스의 접속종료를 탐지하는 방법은 아마도 하나의 연구분야 정도라고 생각되네요..

댓글 달기

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