소켓 프로그래밍 I/O 멀티플렉싱 관련 질문
글쓴이: freesky / 작성시간: 토, 2007/11/10 - 1:13오후
제가 보고 있는 책에서 IO 멀티플렉싱 관련 예제로 다음과 같은 프로그램이 있습니다.
// 윗 부분 생략 fd_set read_fds, tmp_fds; FD_ZERO(&read_fds); FD_SET(ssock, &read_fds); // ssock는 서버 소켓 while(1) { tmp_fds = read_fds; // read_fds의 내용을 tmp_fds에 갱신 if(select(FD_SETSIZE, &tmp_fds, (fd_set*)0, (fd_set *)0, (struct timeval*)0) < 1) { // 생략 } for (fd = 0; fd < FD_SETSIZE; fd++) { if(FD_ISSET(fd, &tmp_fds)) { if(fd == ssock) // 클라이언트에서 접속 요구를 할 경우 { csock = accept(ssock, (struct sockaddr*)&client_addr, &clen); FD_SET(csock, &read_fds); } else { // 클라이언트가 요구한 내용 처리 } } } }
제가 여기서 궁금해 하는 점은 굳이 tmp_fds란 것이 필요한지의 여부입니다.
처음에 read_fds에 서버 소켓을 설정하고, 이를 tmp_fds에 복사한 다음, select 함수로 tmp_fds에서 이벤트가 발생했는지 확인하고, for문으로 어느 파일 디스크립터에서 이벤트가 발생했는지 확인하는 구조입니다.
이런 경우에 만약 서버 소켓이 5번으로 할당되고, for 문을 수행하는 도중 처음으로 접속을 요청한 클라이언트 소켓이 6번으로 할당되었다면, 현재 tmp_fds에는 5번인 서버 소켓만 할당되어 있는 상태라 for 문을 다 돌고 나서야 tmp_fds가 갱신되어 클라이언트 소켓 6번의 이벤트를 처리할 수 있습니다.
제 생각에는 tmp_fds를 없애버리고
select(FD_SETSIZE, &read_fds, ...)
FD_ISSET(fd, &read_fds)
라고 고치면 다음 번 for 문 수행 때 바로 클라이언트가 요구한 내용을 처리할 수 있어서 더 빠를 것 같은데, 이렇게 하는 것에 문제는 없는지 알고 싶습니다.
Forums:
...
그래도, 다시 초기화(예를 들어 , FD_ZERO 사용)하는 부분이 필요하겠군요.
댓글 달기