client socket에서 서버 상태 감시해서 socket 강제 종료 시키는 방법
안녕하세요?
thread 및 select문을 이용해서 socket client 프로그램을 구현해서 테스트중입니다.(client입장에서는 1:1 입니다)
서버의 이상 유무를 감시하고자 10분간격으로 시간 요청 패킷을 서버쪽으로 보내서 15초내에 응답이 없으면
해당 소켓 연결을 종료시키는 프로그램 짰습니다.
프로그램은 아래 처럼 동작합니다.
tx thread에서 10분 간격으로 시간 요청 패킷을 보내고 cond 타이머를 이용해서 15초동안 기다린 후 서버에서 특정 응답 패킷이 들어오지 않으면 해당 socket을 shutdown(shundown(fd,2))을 시킵니다. 이때 socket rx thread의 select문에서 timeout 이벤트가 발생해서
해당 socket을 close 시키는건데....안정적으로 동작이 안되고 불규칙하게 동작이 되네요.
log를 찍어보면 rx thread의 select문에서 timeout 이벤트가 발생이 안되는 경우가 발생이 됩니다.
사실 질문의 요지는 select문을 사용한 소켓 클라이언트 thread를 사용한 상태에서 소켓 서버 상태 감시를 해서 일정 시간 간격으로 데이터를 보내며 해당 시간내에 데이터에 대한 응답이 없을때 강제로 소켓을 종료 시킬 수 있는 방법을 질문드리는건데요..
tx thread에서 해당 소켓을 종료 시킬 수 있는 방법이 마땅한게 없네요. 짧은 지식으로는 shutdown 밖에는 안정적으로 사용할 방법이 없어서 사용을 했는데 잘 동작이 안되니 갑갑하네요...
별도로 소켓 옵션은 주지 않았습니다.
의견 좀 부탁드립니다.
쓰레드를 꼭 두개 쓰셔야 하나요?
방법은 공유가능한 동기화 객체를 통해 tx에서 close하면 될 것 같은데...
예를 들어 두 쓰레드에서 접근 가능한 lock이라는 동기화 객체가 있다면
lock
{
if ( checkConnection() == -1 )
{
socket close;
}
}
lock
{
read();
}
lock
{
write();
}
머 걍 간단히 적었지만 내부적으로 생각할게 많겠죠?
그냥 쓰레드 하나를 두고 read, write를 같이 하면 안될까요?
Write Queue를 하나 두고 말이죠...
그럼 동기화 문제 없이 해결 가능할 것 같은데요
포탈이는 불사신
-------------
포탈이는 불사신
시그널
시그널 문제인듯한데요.
select()부터 타임아웃 검사하는 if문 관련 부분의 로직을 보여주세요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기