select 함수가 이상하게 작동합니다.
글쓴이: trymp / 작성시간: 토, 2011/12/03 - 4:49오후
대량의 TCP패킷을 처리하는 부분은 select로 아래와 같이 다중화하였는데요.
자주 발생하는 현상은 아닌데요.
listen() while (1) { /* tv 값 셋팅 */ n = select = (max+1, readfdt, NULL, NULL, tv); // n값은 1 or 2인 경우도 있음. if (n == 0) continue; if (n < 0) // 애러처리 //신규접속 처리 if (fd == listen_socket) { c = accept() fd_set(c, readfdt); //등록 if (c > max ) max = c; } else // 나머지 client FD 처리 { for(i=0;i<max;i++) if(FD_isset(i, readfdt)) { recv(); close(); FD_CLR(c,readfdt); } }
대략 위와 같은 구조에서 한번에 신규접속을 처리하든, 아니면 client 쪽 소켓을 처리하든
둘중 하나만 할 수 있는 구조입니다.
accept 한 client FD 를 바로 처리하지 않고 select() 를 한번 더 호출하니까
readfdt 내용이 이상하게 바뀌네요.
제가 해당 client FD 에서 recv 를 호출하지 않았는데, readfdt 검사해보니 unset 되어 있습니다.
그래서 lsof 로 검사해보니 client FD 가 garbage 처럼 처리되지 못하고 누적되어 있습니다.
원래대로라면 누적되어 있지 않고 바로 처리하고 없어져야하는데요.
accept 한 client FD 를 recv 하지 않고 있으면 select 할 때마다 계속 data 가 있다고
FD_ISSET에 true 가 나와야 되지 않을까요?
제가 recv 하지 않았는데, select 에서는 해당 FD엣 대해서 data 가 없다고 나오네요.???
고수님들의 많은 조언 부탁드립니다.
}
Forums:
readfdt변수
&readfdt로 바꿔 보세염 글고 tv 즉 time val 은 그냥 NULL로 하시면 변경 있을 때에 리턴 해주니 NULL로 하시는 것도 갠찮을듯
아참 그리고 FD_SET()할 때 따로 readfdt를 쓰지 말고 따로 readfdinit 변수 만들어서
select전에 readfdt=readfdinit; 해주어서 초기화 시켜 주세요 select문 실행되면 그 안에 셋팅 되어 있던 소켓들의 값이 바뀝니다.
예를 들면 메인 소켓 s가 readfdt에 저장 되어 있을 때 connect()요청이 오면 해당 소켓은 flag가 바뀌어서 저장되어 있거든요
다음에 또 쓸라면 초기화 라는 게 필요하겠죠?
댓글 달기