linux socket write, socket disconnect event

zzang3757의 이미지


소켓 전송, 연결 끊어졌을때 발생하는 이벤트에 관련하여 질문 드립니다..

끊어진 소켓에 write 를 하면 -1을 리턴하죠,, 근데 끊어진 소켓에 write 를 하는데 -1을 리턴하지 않고

계속 전송시도한 바이트만큼 리턴을 합니다..

혹시 소켓 설정 관련된 뭔가가있나요..?

서버는 리눅스를 쓰는데,, 클라이언트는 안드로이드 입니다..

핸드폰을 꺼버려도 epoll 에서 끊어졋다는 이벤트가 따로 없네요..ㅠ

datwol의 이미지

넌블럭킹 이 설정되었는지 확인해보세요.

chadr의 이미지

상대가 모바일이라면 약간 고민을 해보셔야합니다.

TCP라는 것의 연결이라는 것은 물리적인 연결이 아닌 논리적인 연결입니다.
상대방이 "나 데이터 못받음"이라고 뭔가 신호를 줘야지만 그제서야 연결 종료가 되는 것입니다.

TCP에서는 응용프로그램에서 데이터를 전송 "요청" 하면 버퍼에 쌓아둡니다.
그리고 TCP의 알고리즘에 따라 상대방이 받을 수 있으면 그제서야 전송합니다.

write함수에서 -1을 리턴 하지 않은건 버퍼에 데이터를 잘 썼다는 의미이지 그게 실제로 상대방이 제대로 받았다는 의미가 아닙니다.

일단은 버퍼에 쓰긴 썼는데 TCP는 데이터를 전송하려고 시도를 합니다.
상대방이 잘 받으면 괜찮은데 어떠한 문제가 생겨서 전송이 안되면 몇번 더 시도를 합니다.
이러다가도 못하면 TCP는 끊김으로 간주하고 그때서야 비로소 응용프로그램이 write를 시도할 때 -1을 리턴합니다.

그런데 이렇게 시도하고 기다리리는 시간이 꽤나 깁니다.
그 동안은 보내는 측에서는 상대방이 아직 연결중이라고 알고 있습니다.

일반적인 인터넷에 물린 상황이라면 상대방이 운영체제를 정상적으로 셧다운 하면 바로 보내는 측에서
끊겼다는걸 알아차리게 됩니다. 하지만 모바일은 조금 다릅니다.

모바일의 네트워크를 매우 간략하게 표현하자면...

서버--------인터넷--------모바일네트워크--------단말기

이런식입니다. 단말기가 직접 인터넷에 연결되어있는 것이 아니라 WCDMA이라면 그에 맞는 네트워크가 구성되어있고
LTE라면 또 그에 맞는 네트워크가 구성되어있으며 이러한 모바일 네트워크와 인터넷을 연결해주는 장비가 따로 있습니다. 이를 게이트웨이라고 합니다.

그런데 모바일의 특성상 무선입니다...
무선이라는 상황은 단말기가 이동 중일 수도 있고 정지상태일수도 있고 건물내일수도 있고 벼락치는 들판 한복판일 수도 있습니다.

이동중이라면 핸드오버가 일어날 가능성이 높고 건물내라면 전파가 안닿을수도 있으며 벼락치는 들판 한복판의 경우에는 벼락으로 인해 전파방해가 일어날 수 도 있습니다.

이러한 예외 상황에서 전화를 하거나 인터넷을 하면 잘 됩니다. 조금 음성이 끊기거나 느려서 그렇지...

이런 상황에서 단말기가 응답이 없다고 해서 단말이 죽거나 전원이 꺼진 상태가 아니라 일시적인 전파장애로인해
통신이 안되고 있는 상황이므로 잠시 후면 다시 단말에서 응답이 올것 이므로 연결 세션을 유지 시켜줘야합니다.

그렇기 때문에 실제 단말이 꺼졌다고 해서 인터넷과 모바일 네트워크를 연결해주는 게이트웨이는 이를 연결 종료로 인식하기까지는 많은 시간이 걸리게 됩니다.

만약에 즉각적인 연결 종료를 인식해야한다면 정해진 시간동안 heart beet 패킷을 주고 받으면서 정해진 시간안에 패킷이 안오면 종료로 인식하거나 해서 종료 처리를 해야합니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

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