소켓서버에 하나의 프로세스에서 다수의 클라이언트를 받아 멀티쓰레드가 아닌, poll 의 다중입출력 방식을 통해 서버를 구현하였습니다.
간헐적으로 한가지 문제가 발생하여 해결하지 못하고 다른분들의 같은 경험이 있으신지 궁금하여 글을 올립니다.
서버입장에서 하나의 사용자가 socket 으로 접속하면, 이를 accept 한 후 setsocket 옵션을 통해
l_onoff = 1;
l_linger = 0;
로 변경과 함께 O_NONBLOCK 옵션을 추가하여 non-blocking I/O 로 통신을 하도록 하였습니다.
문제는 이와 같은 상태로 약 600명의 동시접속자가 사용하고 있을 때, 간헐적으로 클라이언트가 접속을 끊지도 아니하였는데도 불구하고 서버에서는 read() 함수로부터 0 을 반환받고, errno = ECONNRESET 으로 설정되어 클라이언트가 접속을 끊었다는 값을 받는 경우가 있는것이 문제입니다.