TCP Heartbeat 처리..
socket에서 클라이언트 다운 등에 대비해서..
주기적으로 Heartbeat 메세지를 보냅니다.
socket은 recv는 소켓 10개당 1쓰레드가 select로 검사하며 돌고 있구요..
send는 send만 하는 thread pool에 있는 다른 별도 쓰레드에서 수행을 합니다..
recv한 msg는 외부 프로세스에게 전달되고..
외부 프로세스가 데이타 처리 후 결과를 다시 보내주면..
그 결과만 전송하는 방식입니다..
그래서 한 소켓을 가지고..
send와 recv가 별도 쓰레드에서 별로 연관 없이 따로 돕니다..
클라이언트에서 소켓이 끊어진 경우에는..
send와 recv가 모두 에러가 날 거라는 가정하에..
recv에서 감지하도록 하였습니다..
send는 error가 나더라도 그냥 무시했구요..
근데.. Heartbeat Timeout과 같이..
서버가 먼저 접속을 끊을 경우에..
소켓을 close 처리하는게 문제가 있더군요..
send나 recv, select 하는 동안 close를 하지 않게 하기 위해서..
두 thread에서 동시에 send가 일어나지 않도록 막고..
두 thread에서 동시에 recv가 일어나지 않도록도 막아야 하고..
close시엔 recv, send랑 동시에 하지 않도록 해야하는데..
위와 같이 하려면 socket 하나당..
mutex가 3개.. condition variable 1개씩이 필요합니다..
동시접속이 500이라면..
mutex가 1500개.. condition variable이 500개가 필요하지요..
게다가 lock을 너무 자주 걸었다 풀었다 하게 되든경우가 발생하더군요..
어떻게 조금 깔끔하게 처리할 수 있는 방법이나..
다중 접속 처리 소스같은 걸 구할 수 없을까요..??
댓글 달기