소켓에서 어떻게 네트워크 장애를 알 수 있을까요?

xian의 이미지

네트워크 장애를 감지하기 위해서 Heart beat 데이타를 5초 단위로 보내다
상대측 서버의 랜선을 뽑아버렸습니다. 여기서 문제입니다.
제 생각에는 랜선이 뽑히면 소켓에서 send하다 에러를 리턴할줄 알았는데
10분 넘게 정상적으로 send를 하다 10분이 넘은 후에 끊긴 것을 감지하더군요..

어떻게 랜선이 뽑혔거나 기타 네트워크 장애가 났을 때 바로 알 수 있는 방법이 없을까요?
책을 보아도 인터넷을 보아도 쉽게 답을 찾기 힘드네요...
여기 보니깐 bind를 이용해서 알 수 있다고 그러는 분도 있느데 이건 뭔소리인지...

모지리의 이미지

async socket / timeout

이 두가지로 구현해보시면 됩니다.

xian의 이미지

비동기로 하라는 말씀이
넌블록킹 모드로 소켓을 만들어서 데이타를 전송하라는 말씀이신가요?
전 이미 그렇게 하고 있었는데요..
이게 아니라면 모지리님께서 말씀하신게 무슨 뜻인지
자세히 설명해 주시면 안될까요? ^^

송지석의 이미지

select 쓰면 안나오나요?

With lots of love..
Daniel Jiseok Song

xian의 이미지

poll로 해도 랜선이 뽑혔을 때 감지 못하는걸 봐서 select도 안될거 같은데요...
해보지는 않았지만 여기저기 찾아 보니깐 select는 감지 못할거 같던데...

neogeo의 이미지

timeout 이후 socket 상태를 보면 됩니다.

제 경우는 보통 socket을 poll 상태로 쓴다고 하더라도 바로 error 가 리턴되었는데, 뭔가 상황이 좀 더 자세했으면 좋겠군요.

Neogeo - Future is Now.

Neogeo - Future is Now.

xian의 이미지

timeout 되고 getsockopt으로 에러 유무를 확인해봐도 정상적인 것으로 보아
물리적인 원인으로 연결이 단절된 경우에는 안되는 듯합니다. ^^

모지리의 이미지

두가지 정도로 볼수가 있습니다.

첫째는 전송시 타임아웃이 통신 구조에서 벌어지는것인지 아니면 TTL 시간안에 벌어지는것인지입니다. TTL시간까지 기다리면 하세월이죠. 그래서 비동기 통신을 하는것입니다. 비동기 통신을 할경우

리턴값 > 0 이지 안은 경우가 종종 발생합니다. 그래서 리턴값이 < 0 을경우 에러값으로 판단합니다. 이중 진짜 에러인지 아니면 재전송해야 하는 경우인지 판단을 하죠. 비동기 통신이었다면 SEND 에러시 10분이 넘은후에 리턴을 하면 비동기 통신이 되지 않은것으로 판단이 되어집니다. 통신 구조체(SELECT/POLL)의 타임아웃을 지정해보세요.

둘째는 랜의 단절 여부가 내 로컬쪽인지 아니면 중간인지 여부입니다. 이중 중간일 경우에는 알수 있는 방법이 타임아웃밖에는 없습니다. 예를 들면.

A - B - C - D - E 이중에 C에서 랜선이 단절되면 A/E는 당장 알수가 없습니다. 그래서 특정한 타임아웃을 정해놓고 이 시간안에 전송/수신이 이루어지지 않으면 에러로 판단을 보통 하게 됩니다. 이것은 통신 구조체의 타임아웃과는 조금 다른 부분입니다.

TCP 통신의 경우 전송이 보장되지만 언제라는 문제를 안고 있습니다. 그래서 그 언제라는것을 사람이 개입하게 됩니다. 언제까지 되지 않으면 이것은 에러다.. 뭐 이런식으로요.. 흠.. 제가 한 4-5년전에 KLDP에 올려 놓은 통신 프로그래밍 자료가 하나 있을텐데 그것 한번 읽어보세요. 오래돼서 큰 도움은 되지 못할겁니다. 헤헤...

xian의 이미지

중간에 네트워크 연결이 끊겼을 경우에 그냥 heart beat에 대한 결과가 안오면 끊긴 것으로 간주해주는 처리로 해결하였습니다.
답변 정말 감사합니다. ^^

jsj3579의 이미지

TTL값은 시간이 아니라..패킷이 지날수 있는 홉의 수입니다..

그리고 네트워크의 여러 상황은

icmp echo request에대한 응답인 icmp echo reply로 h/w상황등을 알수 있습니다.

sharefeel의 이미지

icmp != socket connection 이라는 데 있습니다.
icmp에 응답한다고 해서 반드시 socket이 사용가능한 상태라는 것을 보장할 순 없습니다.

단순한 예로.. TCP/IP 버퍼가 가득차는 경우가 있을 수 있습니다.
이때 icmp에는 응답을 하겠지만,, socket은 응답이 없거나 굉장히 더디겠죠.

특정 socket이 사용 가능한 지 판단하는 가장 좋은 방법은..
구현하신 대로 해당 socket으로 heartbeat 패킷을 보내는 거라고 봅니다.
===============
Vas Rel Por

===============
Vas Rel Por

sharefeel의 이미지

TTL이 아니라 KEEPALIVE 아닐까요?
===============
Vas Rel Por

===============
Vas Rel Por

댓글 달기

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