[질문] Socket 통신 관련하여 질문 드립니다.
글쓴이: freemckang / 작성시간: 금, 2009/07/10 - 2:02오전
TCP/UDP 소켓 통신을 위해 select를 통한 서버를 구성하였습니다.
문제는, connect까지 성립되고, 물리적으로 이더넷 케이블을 뽑았을 때, select가 error를 리턴하지 못한다는 것입니다.
제 생각으로는 물리적으로 이더넷 케이블을 뽑게 되면 인터럽트가 발생하고, 해당 ISR이 해당 netdevice의 queue에 물려있는 모든 작업들에 fail 처리를 해줄 것으로 기대했었는데... 그렇지 않은 것인가요??
아니면 제 환경이 이상한 것인지... 조언 부탁드립니다 :)
Forums:
제 경험상 말씀드리면.
우선 하드웨어적으로 이더넷 케이블을 뽑는다고 에러가 뜨진 않습니다.
예를 들어 로컬에서 TCP/IP 통신시에 이더넷 케이블 뽑으면 에러나면 안되잖아요?^^;
물론 디바이스 드라이버에서 그런 처리까지 다 해주면 고맙지만..
우선 UDP는 단방향이니 이런 상황은 처리가 안되고요
TCP가 문제인데 예전에 이 문제 때문에 상당히 고생을 했는데
운영체제마다 좀 다르긴 하지만 TCP인 경우에는 에러처리시에 10분정도 걸립니다.
커널에서 설정하는 부분이 있는것 같기도 한데 기억은 안나네요.
소켓 옵션에 KEEPALIVE옵션이 있지만 이것또한 그것과는 거리가 있는듯 하고요.
따라서 이런 문제로 인하여 고스트 문제또한 발생을 합니다.
따라서 이런 문제를 해결하려면
1. UDP 소켓을 이용하여 KEEPALIVE메시지를 주고 받아서 처리한다.(동기식 TCP방식에서) KEEPALIVE메시지가 해당 클라이언트로 부터 일정시간 도착하지 않으면 Retry후 소캣을 강제 종료한다.
2. 비동기 TCP방식이라면 TCP에서 KEEPALIVE메시지를 만들어서 주고 받는다. 처리는 1번과 같습니다.
이 두가지 방법으로 해결했던것 같습니다. 참고하시고요. 더 좋은 방법이 있으신 고수분들 좋은 방법좀 알려주세요~~
이런... 예를 들어
이런...
예를 들어 로컬에서 TCP/IP 통신시에 이더넷 케이블 뽑으면 에러나면 안되잖아요?^^;
이거 생각 못했군요.. ㅎㅎ 너무 아랫쪽으로만 생각하다보니... 조언 감사드립니다~~ :)
句日新, 日新 日新 又日新.
句日新, 日新 日新 又日新.
select()를 쓴다는 것은
select()를 쓴다는 것은 여러 descriptor로부터 데이터를 읽어들일 때 뭔가 준비가 될 때까지 기다리겠다는 의미입니다.
물리적인 연결 단절이 select()에 영향을 주는 게 좀 이상하죠?
연결이 유효한지, read/write가 잘 되는지는 select와는 다른 방법으로 점검해야 할 것 같습니다.
댓글 달기