[질문] TCP bronken pipe...

익명 사용자의 이미지

안녕하세요 ^^;

보통 tcp connection이 이루어지고 난 이후에 클라이언트로부터 연결이 끊
어진 경우 broken pipe로 확인할 수 있는데요.

우선 레드햇 리눅스로 서버작업을 하고 있습니다. 그런데 경우에 따라서
연결이 끊어졌다는 것을 인식하지 못하는 경우가 꽤 많이 있습니다. 이런
경우 주기적으로 메세지를 날려서(폴링) 확인할 수 있겠습니다만 더 괜찮
은 방법이 있을런지요?

또, 밑에 질문에도 썼었습니다만 소켓 연결이 되어 생성되는 소켓이 닫혀
도 그대로 남아있는 것처럼 확인할 수 있었습니다. 메모리 상태를 보기 위
해서는 top 프로그램을 사용했습니다.

그럼 즐거운 하루 되시길~

익명 사용자의 이미지

select 를 쓰면...다 잡을 수 있지 않을까요?.

readfds 에....어떤게 잡혔을때..

read() 값이 0 라면....끊긴거니까.

그 소켓을 없애주면...되겠네요...

익명 사용자의 이미지

안녕하세요 ^^;

예 물론 그렇게 하고 있습니다. 그러나 아쉽게도 다 잡히지가 않습니다.
될 수 있으면 끊어지고나서 바로 확인이 가능해야 하는데 그게 매우 늦어
지는 경우가 있습니다. 그게 문제인 셈입니다.

즉, 끊어진 상황을 언젠가는 확인할 수 있지만 곧바로 끊어짐의 유무를
알 수 있는 경우와 그렇지 않고 꽤 많은 시간이 소요된 이후에 알 수 있
는 경우가 있어서 질문을 한 것입니다. ^^;

즐거운 하루 보내시기 바랍니다. ~

익명 사용자의 이미지


tcp를 사용할때 상대편에서 접속을 끊으면
SIGPIPE가 발생 되는 것이 아니라.
끊어진 후 write시점에 SIGPIPE가 발생 됩니다.
때문에 signal로는 write시에만 알수 있습니다.

그렇기 때문에 disconnect시점에 즉시 알기 위해선
반드시 read를 해보아야만 알수 있습니다.
즉 poll(select도 동일)시 pollin event가 set되었는데도
read에서 size가 0이면 이것은 disconnect된것으로 봅니다.
또한 disconnect 되면 반드시 poll(select) pollin event는
set됩니다. 때문에 시간이 걸린다는 것은 이해가 되질 않네요.

그리고 위의 속성을 이용하면 좀더 정확한 결과를 얻을 수 있을겁니다.
즉 network의 부하를 감안 하고서도 정확한 disconnect의 정보를
얻고자 한다면 일정한 주기를 가지고서 write를 하는 겁니다.
즉 예전의 rr check와 동일한 방식으로 check data를 주고 받는다면
조금더 정확한 정보를 얻을 수 있습니다.

다른 방법으로는 kernel로부터 정보를 취득하는 방법이 있습니다.
이것은 netstat를 작성하는 것으로 line은 약 100여 line정도면
구현 할 수 있습니다. 그러나 이것은 단점은 root권한으로 수행
되어야 한다는 겁니다.

어떤 방법을 쓰시던 system에 부하가 걸리는 것은 감수 해야 합니다.
두번째 방법만이 system에 덜 부담이 가죠.....

익명 사용자의 이미지

안녕하세요.

답글 감사하구요. 맞습니다. 제가 쓰다보니 이상하게 적은 것 같습니다.
^^;

문제는 그렇게 보내거나 읽기 전에 연결이 끊어진 것을 알고 싶습니다.
select를 사용해서 변화가 생기면 그것을 읽어 판단합니다. 이 때 read 값
으로 -1 (에러)가 들어오면 연결이 끊어진것으로 간주합니다. 문제는 분명
히 연결이 끊어졌음이 분명한데도 select되지 못하는데 있습니다. 서버의
로그를 확인해보면 분명히 접속되어 있지 않은 것이 분명한데도 말이죠.
이게 제 질문이었습니다. ^^;

netstat나 lsof 같은 프로그램으로 확인해보아도 연결이 되어있는 것으로
나옵니다. 어떻게 해결해야 하는 걸까요?

그리고 pollin event라고 하셨는데 제가 잘 몰라서 일단 내일 책을 찾아보
겠지만 간단하게나마 알려주셨으면 합니다. 님이 말씀하신대로 pollin
event가 반드시 셋 된다면 이벤트 핸들러를 작성하면 해결될 수 있겠죠.

그럼 즐거운 시간 보내시기 바랍니다.

익명 사용자의 이미지

저도 이렇게 해보았지만..
클라이언트측에서 시스템 크래쉬가 발생하거나..
네트웍 회선이 끈겨 버리면 서버측에서는 연결 종료를 모르지요..

즉 계속 접속해 있는걸로 알고 있고..
그렇게 되면 keepalive시간까지 계속 살아 있는 결과가 발생합니다.

저도 이문제 때문에 고민이 많습니다 아직 뚜렷한 해결책은 없네요..
아니있는데 시작 엄두가 안되네여..

첫번째 위에 말씀대로 클라이언트와 서버간의 주기적인 데이터 통신이
필요 하겠지요...

두번째 아니면 서버측에 NMS를 삽입시키는 방법이 있을거 같네요..

세번째 안되면 keepalive시간을 단축시키는 방법이 있겠지요..
이방법은 쩝 위험성이 많더군요.. 리눅스박스 전체에 다 영향을 미치니
엄청난 패킷들을 감수해야 한다는거지요...

아무튼 서버단의 퍼포먼스는 이 방법을 해결하려면 결국 떨어진다는 결론
이지요..

에혀 뚜렷한 해결책 읍나 정말 쉽고 확실한 방법 --+

익명 사용자의 이미지

netstat를 구현 하면 되쟎아요
여기서 모든 connection들을 감시하면 알 수는 있죠.

익명 사용자의 이미지

안녕하세요. 여기 게시판 글을 보다 보니까..제가 요즘 고민하는 사항에
대한 글이 있어서요.
말씀하신거 잘 보았는데요..
제 경우는 read/write로 구현을 하지 않고 소켓이 연결되었을때,
서버에서는 recv()로 데이타를 받고 클라이언트에서는 send()를 이용해서
데이타를 보내거든요.
이럴때는 윗분이 질문하셨던 사항이 발생했을때, 서버에서 어떻게 관리 될
수 있을까요 ?

조언 부탁드려요 ^^; 제가..이쪽에 대해 초보라서요..자세히 말씀해 주
심 감사하겠습니당...

댓글 달기

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