소켓에서 어떻게 네트워크 장애를 알 수 있을까요?
글쓴이: xian / 작성시간: 월, 2008/06/30 - 11:20오전
네트워크 장애를 감지하기 위해서 Heart beat 데이타를 5초 단위로 보내다
상대측 서버의 랜선을 뽑아버렸습니다. 여기서 문제입니다.
제 생각에는 랜선이 뽑히면 소켓에서 send하다 에러를 리턴할줄 알았는데
10분 넘게 정상적으로 send를 하다 10분이 넘은 후에 끊긴 것을 감지하더군요..
어떻게 랜선이 뽑혔거나 기타 네트워크 장애가 났을 때 바로 알 수 있는 방법이 없을까요?
책을 보아도 인터넷을 보아도 쉽게 답을 찾기 힘드네요...
여기 보니깐 bind를 이용해서 알 수 있다고 그러는 분도 있느데 이건 뭔소리인지...
Forums:
..
async socket / timeout
이 두가지로 구현해보시면 됩니다.
죄송합니다만..
비동기로 하라는 말씀이
넌블록킹 모드로 소켓을 만들어서 데이타를 전송하라는 말씀이신가요?
전 이미 그렇게 하고 있었는데요..
이게 아니라면 모지리님께서 말씀하신게 무슨 뜻인지
자세히 설명해 주시면 안될까요? ^^
select 쓰면
select 쓰면 안나오나요?
With lots of love..
Daniel Jiseok Song
rommance.net
poll 쓰고 있는데요..
poll로 해도 랜선이 뽑혔을 때 감지 못하는걸 봐서 select도 안될거 같은데요...
해보지는 않았지만 여기저기 찾아 보니깐 select는 감지 못할거 같던데...
timeout 이후 socket
timeout 이후 socket 상태를 보면 됩니다.
제 경우는 보통 socket을 poll 상태로 쓴다고 하더라도 바로 error 가 리턴되었는데, 뭔가 상황이 좀 더 자세했으면 좋겠군요.
Neogeo - Future is Now.
Neogeo - Future is Now.
답변 감사합니다.
timeout 되고 getsockopt으로 에러 유무를 확인해봐도 정상적인 것으로 보아
물리적인 원인으로 연결이 단절된 경우에는 안되는 듯합니다. ^^
...
두가지 정도로 볼수가 있습니다.
첫째는 전송시 타임아웃이 통신 구조에서 벌어지는것인지 아니면 TTL 시간안에 벌어지는것인지입니다. TTL시간까지 기다리면 하세월이죠. 그래서 비동기 통신을 하는것입니다. 비동기 통신을 할경우
리턴값 > 0 이지 안은 경우가 종종 발생합니다. 그래서 리턴값이 < 0 을경우 에러값으로 판단합니다. 이중 진짜 에러인지 아니면 재전송해야 하는 경우인지 판단을 하죠. 비동기 통신이었다면 SEND 에러시 10분이 넘은후에 리턴을 하면 비동기 통신이 되지 않은것으로 판단이 되어집니다. 통신 구조체(SELECT/POLL)의 타임아웃을 지정해보세요.
둘째는 랜의 단절 여부가 내 로컬쪽인지 아니면 중간인지 여부입니다. 이중 중간일 경우에는 알수 있는 방법이 타임아웃밖에는 없습니다. 예를 들면.
A - B - C - D - E 이중에 C에서 랜선이 단절되면 A/E는 당장 알수가 없습니다. 그래서 특정한 타임아웃을 정해놓고 이 시간안에 전송/수신이 이루어지지 않으면 에러로 판단을 보통 하게 됩니다. 이것은 통신 구조체의 타임아웃과는 조금 다른 부분입니다.
TCP 통신의 경우 전송이 보장되지만 언제라는 문제를 안고 있습니다. 그래서 그 언제라는것을 사람이 개입하게 됩니다. 언제까지 되지 않으면 이것은 에러다.. 뭐 이런식으로요.. 흠.. 제가 한 4-5년전에 KLDP에 올려 놓은 통신 프로그래밍 자료가 하나 있을텐데 그것 한번 읽어보세요. 오래돼서 큰 도움은 되지 못할겁니다. 헤헤...
감사합니다.
중간에 네트워크 연결이 끊겼을 경우에 그냥 heart beat에 대한 결과가 안오면 끊긴 것으로 간주해주는 처리로 해결하였습니다.
답변 정말 감사합니다. ^^
TTL 값에 대해서 오해하고 있으신데요...
TTL값은 시간이 아니라..패킷이 지날수 있는 홉의 수입니다..
그리고 네트워크의 여러 상황은
icmp echo request에대한 응답인 icmp echo reply로 h/w상황등을 알수 있습니다.
icmp를 이용하는 방법의 문제는..
icmp != socket connection 이라는 데 있습니다.
icmp에 응답한다고 해서 반드시 socket이 사용가능한 상태라는 것을 보장할 순 없습니다.
단순한 예로.. TCP/IP 버퍼가 가득차는 경우가 있을 수 있습니다.
이때 icmp에는 응답을 하겠지만,, socket은 응답이 없거나 굉장히 더디겠죠.
특정 socket이 사용 가능한 지 판단하는 가장 좋은 방법은..
구현하신 대로 해당 socket으로 heartbeat 패킷을 보내는 거라고 봅니다.
===============
Vas Rel Por
===============
Vas Rel Por
TTL이 아니라..
TTL이 아니라 KEEPALIVE 아닐까요?
===============
Vas Rel Por
===============
Vas Rel Por
댓글 달기