멀티스레드 서버에서 클라이언트의 종료를 알 수 있는 방법
글쓴이: 익명 사용자 / 작성시간: 금, 2019/06/14 - 9:14오전
리눅스 멀티스레드 서버를 만드는 중인데 클라이언트가 종료되었음을 아는 방법이 있을까요? 연결 요청이 들어올 때마다 클라이언트 소켓 디스크립터를 만들어서 스레드를 만들고 그 인자로 디스크립터를 전달하는데 epoll로 이 디스크립터를 관리하면서 EPOLLRDHUP 이벤트가 발생하는지 검사하려고 합니다. 사실 구현은 해보지 않아서 잘 작동하는지도, EPOLLRDHUP이 이렇게 사용하는건지도 감이 오지 않습니다. 어떻게 해야할까요?
Forums:
...
구조가 잘 이해가 안 가는데요, 연결이 생길 때마다 스레드를 만들면 그 스레드는 자기가 맡은 단 한 개의 fd만 보면 되니까 그 스레드가 계속 read를 하면서 처리를 하다가 eof를 만나면 스레드를 끝내면 되는 거 아닌가요?
select/poll/epoll은 하나의 스레드가 여러 개의 connection을 관리해야 할 때 쓰는 거죠.
...
메인 프로세스에서 listen()으로 기다리다가 연결요청이 들어오면 accept()로 클라이언트 소켓을 생성합니다. epoll 인스턴스에 이 클라이언트 소켓 디스크립터를 등록하고 스레드를 만들어 이 스레드에 인자로 소켓 디스크립터를 전달합니다. 스레드는 해당 클라이언트와 통신을 하고 EPOLLRDHUP(연결 종료) 이벤트가 들어온 소켓 디스크립터에 대해 연결을 해제한다. 이런식으로 구성하려고 합니다. 제가 부족함이 너무 많아서 이런 식의 구성을 사용하지 않는지 잘 모르겠습니다.
저도 그런식으로 구현해봤습니다. 거의 동일한
저도 그런식으로 구현해봤습니다. 거의 동일한 방식이네요.
한쪽 스레드에서는 sockfd 감시를 하고 실제 sockfd에서 데이터 read는 각 connection별로 스레드를 생성해서 처리하였습니다. 종료되었을 경우 sockfd를 감시하여 EPOLLRDHUP이나 기타 에러 상황일 경우, tid를 기준으로 해당 스레드를 종료시켰습니다.
연결된 소켓의 이벤트를 감시해서 POLLHUP,
연결된 소켓의 이벤트를 감시해서 POLLHUP, POLLERR, POLLNVAL 등이 검출되는지 보시면 됩니다.
epoll 을 이용한 멀티플렉싱 + 멀티스레딩을
epoll 을 이용한 멀티플렉싱 + 멀티스레딩을 사용하려고 하시나보네요.
비슷한 구조로 구현해봐서 허접한 답변 드립니다.
우선 다양한 방법이 있을수 있습니다.
몇가지 생각나는 예를들면 말씀하신 방법대로 epoll_ctl()에 EPOLLRDHUP을 등록합니다.
그렇게되면 등록된 client socket이 종료 될경우 event가 발생하여 epoll_wait() 함수를 빠져거고
read 함수의 리턴값을 체크하여 해당 클라이언트 소켓이 종료되었는지 확인합니다.
종료되었을경우 해당 클라이언트 소켓에서 데이터를 읽고 있는 스레드에 pthread_kill 등을 통해 종료시키면 될것 같아요. 그러려면 해당 스레드의 tid를 기준으로 종료해야 될거고 별돌로 epoll 스레드에서는 스레드를 생성할때마다 tid를 관리하고 있어야겠네요.
댓글 달기