리눅스 소켓프로그래밍중 클라이언트 접속상태를 확인하는 방법이 없을까요?

wodnrrns의 이미지

서버에서 특정 스트림을 클라이언트들에게 방송 하는 형태의 서버를 만들고 있습니다.
이때 서버에서 클라이언트의 접속이, 해제가 자유롭게 하기 위해서 접속된 클라이언트의 소켓을 확인하는 작업때문에 고민중입니다.
우선 실시간성과 메모리 문제로 뮤텍스와 세마포를 사용하지 못해서 nonblock 소켓을 사용하고 있습니다.
프로토콜은 저는 이상하다고 생각하지만 TCP를 상요하고있습니다.

질문만 간단히 말씀 드리면 recv()와 같이 대기하는 형태를 쓰지 않고 클라이언트의 접속이 끊어졌는지를
확인하는 방법이 없을까요?

생각한 방법으로는 write()함수나 send() 함수로 패킷을 보냈을때 실패할경우 해당 클라이언트 접속을 종료하는 방법으로
구현을 했는데요.
문제는 중간에 서버에서 보내는 데이터를 클라이언트측에서 받지 못하거나 할때도 무조건 클라이언트 접속을 끊어버리는것이 문제입니다.

클라이언트 측에서 접속요청을 끊었는지를 효과적으로 확인할 수 있는 방법이 있을까요?

haze11의 이미지

gracefully closing이라 하나요? 정상적으로 소켓이 닫혔을 경우 send/recv에서 0을 리턴하는 것으로 알고 있습니다.
보통은 이 것 보다 ping 혹은 echo 를 많은 쓰는 것 같습니다.
TCP의 경우 확실히 보낸다는 가정이 있기 때문에 전송을 실패할 경우 끊어졌다 봐도 됩니다.

recv()와 같이 대기하는 형태라는 것은 어떤 건가요? nonblock이라면 대기하지 않을 것 같은데요.

wodnrrns의 이미지

제가 확인한바로는 nonblock의 경우에도 recv()함수에서 연결된 소켓에 무언가 데이터가 들어올때까지 대기하게 됩니다.
(물론 받을게 있을때까지 대기하는게 당연하겠지요.)

TCP의 경우 패킷의 손실이 있을경우 재전송한다는건 ack 값으로 확인하는건 알고 있습니다.
문제는 서버랑 클라이언트쪽 모두 명시적으로 소켓을 끊어주지 않았는데도 연결이 주기적으로
끊기는 현상이 발생해서 해당 글을 올리게 된것입니다.
지금 클라이언트측에서 서버에서 전송하는 내용을 다 받지 못할경우 끊어지는 현상으로 분석 되고있는데요.

그럼 문제를 조금 바꿔서 서버에서 딜레이를 주고 서비스하는 방법 외에는 방법이 없을까요?

댓글 달기

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