TCP 연결 시, client에서 서버 종료를 어떻게 감지하나요?
글쓴이: hahaite / 작성시간: 화, 2017/02/21 - 11:19오전
안녕하세요.
리눅스에서 두 프로세스 간 TCP로 연결하여 데이터를 주고 받는 걸 짜고 있습니다.
정보 문화사의 linux Programming (3판, Neil Mathew 저) 의 소켓 챕터를 참고하고 있구요.
서버 쪽은 select() 함수를 이용해,
- 클라이언트가 연결을 시도함.
- 클라이언트가 데이터를 전송함.
- 클라이언트가 연결을 종료함. (클라이언트 강제종료 포함.)
모두 잘 인지하는 것을 확인하였습니다.
문제는 클라이언트 쪽인데요.
클라이언트 단에서 서버가 종료 (강제종료) 됨을 어떤식으로 알 수 있나요?
주기적으로 서버랑 통신해서 상태를 확인하는 방법이 최선인가요?
(이 경우 체크하는 thread와 데이터 수신 thread를 둘텐데,
이게 효율적인 방법인지도 모르겠습니다.)
고수님들의 조언 부탁드립니다.
감사합니다.
Forums:
제 기억이 맞다면...
select 함수 event 발생시 read 하면 0 가 읽혀질 거에요.
ㅎㅎ 왜 select() 호출 안되나 했더니 FD
ㅎㅎ 왜 select() 호출 안되나 했더니 FD_SET()으로 등록을 안했네요.
도움 감사합니다. ^^
^^
서버랑 같습니다.
recv을 호출해도 크기 0을 출력합니다.
그런데 실제로 프로그램이 돌아가다 보면 랜선이 뽑히던지 예기지 않게(close handshaking없이)연결이 끊기는 경우가 있는데 이런건 이런식으로 해결 못하고 주기적으로 ping패킷을 만들어 날리던지 해서 감지해야 합니다.
지금 select() 함수로 대체해 보고 있는데요.
지금 select() 함수로 대체해 보고 있는데요.
최악의 경우 알려주신대로 ping 을 때리던지 해야겠네요.
도움 감사합니다. ^^
^^
방법이 다양합니다.
책에있는건 정상적인 경우를 가정했을때의 상대편 접속종료를 처리하는 루틴이 대부분이구요
종료는 정상적인 종료,비정상적인 종료 이렇게 2가지로 나뉘고 비정상적인 종료가 되는 경우는 매우 다양합니다.
예를들면 프로그램이 돌아가고있는데 디바이스 전원이 갑자기 꺼진다던지, 배터리가 갑자기 분리된다던지 하는경우입니다.
이런경우에는 시간이 충분히 지나면 종료이벤트가 날아가기는 하지만 , 언제 종료이벤트가 날아갈지 정확히 알수가없고 종료를 알기까지 오래걸리는 경우가 많습니다.
그래서 보통 Heartbit 라고해서 살아있는지 체크하는 알고리즘을 따로 구현하게됩니다.
근데 이 Heartbit 를 어떻게 짜느냐는 또 프로그램 특성, 업체별로 다양하게 존재합니다.
보통 기준은 상대디바이스의 정상,비정상 적인 종료를 얼마나 빠르고 정확하게 감지하냐 이고 , 그럼에도 디바이스와 네트워크에 무리를 주지않는 그런 알고리즘을 계획하게됩니다.
Heartbit 를 위한 스레드를 따로 생성하는것에서부터 , 자식 프로세스를 이용할수도있고 , 스레드 , 자식 프로세스 같은 무거운 방식이아닌 좀더 light 한 방법을 이용할수도있겟죠..
아무튼 말씀하신 상대디바이스의 접속종료를 탐지하는 방법은 아마도 하나의 연구분야 정도라고 생각되네요..
댓글 달기