[완료] FD_ISSET과 select함수에 대하여...
리눅스에서 socket 통신은 처음이라... 여러군데서 정보를 찾아 넌블럭 소켓으로 프로그램을 짜고 있습니다.
그런데 아래 소스에서 궁금한 점이 생겨서 이렇게 질문 드립니다.
while( 1 )
{
tv.tv_sec = timesec; // select 함수 time아웃 설정
tv.tv_usec = 0;
FD_ZERO(&w_set);
FD_SET(fd, &w_set);
retval = select(fd+1, NULL, &w_set, NULL, &tv);
printLog(lp, STAMP, " retval [[[ %d ]]] \n", retval);
if( retval < 0 && errno != EINTR )
{
close(fd);
return -1;
}
else if( retval > 0 ) // retval 이 양수가 오면 Connect에 성공한것이다.
{
if(FD_ISSET(fd, &w_set))
{
}
}
}
이 소스에서 왜 select를 while문으로 감싸주는지와(제 생각으로 select에 타임 설정을 해주어 while을 해주면 계속해서 select가 호출되어
시간이 계속 갱신될거 같음) FD_ISSET 이라는 함수로 넌블럭 소켓에 대한 정확한 감시가 될수 있는지 입니다.
이 포럼에 글을 찾아 읽어보니 소켓이 끊기거나 아니면 정말로 write할수 있는 상태가 되면 FD_ISSET은 TRUE를 리턴한다는데...
두 가지 경우를 구분 할 수 있는건 결국 send(write)를 해봐야지만 가능한건지도 궁금합니다.
manual을 잘 읽어보세요.
대부분의 질문하신 내용은 manual 을 잘 보면 나올 듯한 내용인듯 합니다.
1. timeout 설정은, 필요 없으면 안 하시면 됩니다. 그럼 정말 event 가 있을 때에만 select 에서 튀어 나오게 되겠지요.
2. FD_ISSET 은... 뭔가 select 의 동작을 이해 못하신 게 아닌가 싶군요.
select 에서 fdset의 fd를 감시하여 buffer가 비어 있으면 marking 을 해 줍니다. 그럼 그 marking 된 내용을 확인하기 위한 MACRO가 FD_ISSET 입니다.
3. 소켓이 끊기는 건 write 쪽으로는 알기 힘듭니다. read 쪽에도 select를 걸어 주고, 해당 event 가 일어났을 때 실제로 read 함수를 불러 주어야 합니다.
댓글 감사합니다.
넌블럭킹 소켓에서 select와 FD_ISET에대한 내용에 대해여 해결을 봤습니다.
select나 FD_ISSET이나 둘다 연결이던 연결이 종료되던 이벤트를 돌려 주며
이 이벤트를 분석(getsockopt)하여 에러 넘버가 Success가 아니면 다 연결을 하지 못한것으로 간주하고 처리 하였습니다. ^-6
댓글 달기