select 함수가 이상하게 작동합니다.
대량의 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
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 가 없다고 나오네요.???
고수님들의 많은 조언 부탁드립니다.
}
댓글 달기