서버에서 데이터 시그널을 못받는 경우도 있나요?
안녕하세요.
서버는 커널 2.4 버전의 RTS + thread Pool을 기반으로 만들어졌습니다.
. . 소켓 생성 . . if (setup_sigio (nListenFd, signum, getpid()) == -1) msg.ErrMsg ("setup_sigio error"); sigemptyset (&set); sigaddset (&set, SIGRTMIN+signum); sigprocmask (SIG_BLOCK, &set, NULL); msg.LogMsg ("Accept Thread [pid:%d] started..........", getpid()); pthread_mutex_lock (&sync_lock); pthread_cond_signal (&sync_cond); /* Notify sync_cond signal to main() */ pthread_mutex_unlock (&sync_lock); while (1) { ret = sigwaitinfo (&set, &si); /* waiting for any connection */ if (ret == SIGRTMIN+signum) { . . if (si.si_fd == nListenFd) { 소켓 연결 accept } else { 로그인 처리 } . . } }
서버가 실행하면 listen 으로 소켓의 접속을 기다립니다.
sigwaitinfo 함수에서 시그널을 기다리다가 클라이언트로부터
소켓 접속이 있으면 위에 보시는 루틴을 한번타서 소켓 연결(accept)을 시키고 새로운 소켓으로 연결을 넘겨줍니다.
클라이언트에서 는 connect 뒤에 바로 소켓에 로그인에 필요한 정보를 보냅니다. (클라이언트에서 connect 후에 바로 send를 합니다.)
( 클라이언트에서 소켓 connect 시에 시그널 한번 발생)
( 해당 클라이언트와 연결된 소켓으로 값이 들어오면 시그널 발생)
이렇게 두번 시그널이 들어와서 처리합니다.
문제는 어쩌다가 한번씩 서버에서 클라이언트의 소켓 연결에대한 시그널만 받아 처리하고 해당 시그널에서 생성된 소켓으로 들어오는 데이터를 인식하지 못하는 경우가 생겼습니다.(서버에서는 시그널이 안들어 온것으로 인식)
처음에 생각하기로는 단순한 네트워크 장애로 판단했으나 그럴 가능성은 매우 희박하다고 생각합니다.
RTS 서버라서 서버에 잘못된 값이라도 시그널 값이 들어와야 그다음 동작을 하는 것으로 알고 있습니다.
제가 알고 싶은것은 sigwaitinfo 함수가 제대로 동작 안할 경우도 있는건가요?
만약 그럴 경우가 없다면... 어떤 문제로 생각해 봐야 할까요?
관련 자료를 찾아보는데 그런 내용은 아직 못찾았습니다.
제가 참고할만한 사이트나 이런것을 겪어 보신 분이 계시면 조언 부탁드립니다.
참고로 sigtimedwait() 함수도 제대로 작동하지 않았습니다.
답변 미리 감사드립니다.
댓글 달기