네트웍프로그래밍시 한쪽의 링크가 끊어졌을경우.
글쓴이: scarletH / 작성시간: 수, 2003/06/11 - 4:00오후
소켓을 맺어 계속 통신을 하던중
서버나 클라이언트 한쪽의 링크(물리적 링크)가 빠졌습니다.
이때 소켓이 없어진것은 아니니 다시 링크를 끼운다면.. 통신이 되지 않을까
싶은데.. 안더라구요. 일정시간동안 링크 끊겼다는 메시지두 없구요.
이때.. 소켓이 죽지 않은 경우에 한해서 다시 링크가 살았을경우 통신할 수 있는 방법이나.. 아니면 송신측에서 어떤 데이타를 보내서 클라이언트가 반응이 없으면 바로 끊어버리는(다시 연결될수 없다면 불필요한 소켓일 것이므로) 방법이 없는지 알고싶습니다. SO_KEEPALIVE 의 경우 2시간 이상의 경우만 사용하거나 짧은 시간으로 변경해서 사용하하면 오히려 안좋다고해서요.
다른 방법이 없는지 문의 드립니다.
Forums:
잘은 모르지만...
스티븐님의 UNIX NETWORK PROGRAMMING 책을보면 1초단위로 폴링하는 소스가 나오는것 같네요.
물론 1초 단위로 폴링하면 안되겠지만, 이걸 5분단위나 원하시는 시간으로하면 될듯합니다.
그리고 저도 궁금한건데, 서로 데이터를 주고받지않는 상황에서 랜선을 뽑았다가 껴도 소켓이 죽나요?[/code]
Re: 잘은 모르지만...
서로 데이터를 주고 받지 않는 상황에서는 일반적으로 소켓이 죽지 않습니다.
서로 데이터를 주고 받지 않는 상황에서 랜 선이 빠지지도 않았는데도 소켓이 죽는 경우는, 대개 그 사이에 NAT류의 시간단위 Session 관리구간이 존재하기 때문이고, time out 되면 조용히 그 세션은 없어지게 됩니다. 양측에 Reset 신호도 보내지 않는 경우가 일반적입니다.
이 경우 최초 송신할 때, 송신하는 녀석만 reset을 감지하게되며, 수신대기상태에있는 녀석은 KEEPALIVE 같은 socket option을 사용하지 않았다면, 영원히 대기 상태에 들어가게 됩니다.
KEEPALIVE는 윗분의 말대로 2시간 정도이며, application에서 조정할 수 있는 값은 아닙니다. 따라서, 영구 접속을 해야하는 프로토콜을 작성하실때에는 반드시 마지막 송수신에 대한 timeout 기능을 넣어 회선 확인하는 기능을 프로토콜에 넣어 주셔야합니다.
KEEPALIVE는 TCP/IP에서 TCP Packet으로 구현되어 있기 때문에, 어플리케이션레이어하단에서 자동으로 감지하는 훌륭한 기능이지요. 하지만, 문서를 보면, TCP/IP 를 구성하는 필수조건이 아니므로 아주 열악한 상황에서는 구현이 되지 않는 경우도 있습니다. 요즘 나오는 구현은 그런 걱정안하셔도 될 것 같네요.
---
http://coolengineer.com
댓글 달기