socket send에서 error발생을 안하는 경우 ??

yangsg의 이미지

socket 프로그램을 하고 있습니다..
클라이언트에서 수시로 접속이 끊기는 경우가 발생을 해서 그걸 서버에서 알수 있는 방법이 keepalive로 2시간을
기다리자니 그건 아닌듯 하여 얼마간의 시간동안 (쫌 무식한 방법이지만?) 모든 클라이언트들에게 NULL을 던져서 error 발생하는 경우 종료를 해줄려고 생각을 했습니다..

그런데 난감한게... 테스트 중에 클라이언트를 접속시킨 후 클라이언트에서 랜선을 뽑아서 서버에서 알수 없게 하였습니다..
그리고 나서 그 클라이언트로 send를 하였는데.. 난감한게 그냥 날라가는 군요...
EPIPE 요 error를 기대했는데.. 발생을 안하네요...

제가 뭘 잘못 알고 있는 건가요.. ??

익명 사용자의 이미지

코드가 길지 않다면 첨부 부탁드릴께요.

shrrot wrote:
socket 프로그램을 하고 있습니다..
클라이언트에서 수시로 접속이 끊기는 경우가 발생을 해서 그걸 서버에서 알수 있는 방법이 keepalive로 2시간을
기다리자니 그건 아닌듯 하여 얼마간의 시간동안 (쫌 무식한 방법이지만?) 모든 클라이언트들에게 NULL을 던져서 error 발생하는 경우 종료를 해줄려고 생각을 했습니다..

그런데 난감한게... 테스트 중에 클라이언트를 접속시킨 후 클라이언트에서 랜선을 뽑아서 서버에서 알수 없게 하였습니다..
그리고 나서 그 클라이언트로 send를 하였는데.. 난감한게 그냥 날라가는 군요...
EPIPE 요 error를 기대했는데.. 발생을 안하네요...

제가 뭘 잘못 알고 있는 건가요.. ??

bugiii의 이미지

서버든 클라이언트든 누군가가 정기적으로 패킷을 반대편으로 보낸한 후에 그에 대응되는 패킷을 반대편에서 보내주셔야 합니다. 한쪽에서만 뭔가 보낸다고 해서 소켓 차원에서 끊겼는지 알 수 있는 방법은 없습니다. 결국 어플리케이션 레벨에서 심박 센서같은 역할을 하도록 만들어야 한다는 것입니다. 심장이 안뛰면 무슨 조치를 취해야...

저같은 경우에는 클라이언트에서 일반적인 패킷을 보낼 때 차체적으로 시간 만료를 초기화하고 이 시간 만료가 되면 살아 있다는 패킷을 서버에 보냅니다. 서버도 클라이언트당 시간만료 값을 가지고 있고 패킷이 들어올 때 초기화하고 시간 만료가 되면 접속을 끊는다든가 하는 처리를 했습니다.

서지훈의 이미지

alram() 을 이용하면 문제 해결에 도움이 되지 않을지요?
일정 시간이 지나면 플래그를 확인해서 작업중 이라면 해당 작업을 마무리를 시키고...
해당 작업이 무사히 끝난 경우에는 alram()값을 다시 초기화 하는 방식으로 하면은 문제 해결에 그럭저럭 도움이 될 듯하군요.

아니면 일정 시간마다 NOOP를 보내는 방법을 생각 해볼 수도 있지만...

그리고 소켓의 자체 TIMEOUT을 사용 하셔도 될듯 하군요.

이 들의 장단점을 잘 파악 하셔서 사용을 해보시길...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

yangsg의 이미지

클라이언트쪽에서 랜선을 뽑고나서
그쪽 fd로 send를 한다고 해서 error가 발생하지는 않는거군요..
제가 확실히 잘못 알고 있었네요..
전 당연히 물리적으로 떨어졌을 경우 그 fd로 send를 할경우
EPIPE 요런 error가 잡히는 줄 알았는데...
그렇다면 결국엔 alarm을 이용해서 서버에서 클라이언트로
살아있냐 ? 더미패킷 던지면 클라이언트에서도 응답을 해줘야 하겠네요..
그렇지 않다면 요게 끊어졌는지.. 어땠는지 알아낼 방법이 없는거 같군요..
제가 제대로 이해를 한거 맞는지요... 흠...

댓글 달기

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