select에 대해...
글쓴이: 살자 / 작성시간: 목, 2003/09/04 - 1:23오후
select 사용시
struct timeval tim;
tim.tv_sec = 0;
tim.tv_usec = 0;
while(1)
{
select(MAXfd, &rset, NULL , NULL,&tim);
if(FD_ISSET(sockfd))
{
if((readbyte = read(sockfd, recvBuff, MAXSIZE)) > 0)
{
}
}
}
위의 코드 처럼 구현을 했을때..
클라이언트에서 Close를 하면 어떻게 체크를 해야 하는지여?
고수님들의 조언 부탁드립니다.
Forums:


Re: select에 대해...
close 해도 select 되어 내려오게 되며, read, recv 에서 0 을 return 합니다.
---
http://coolengineer.com
일반적으로 소켓 옵션을 보거나 클라이언트로부터 read한 값이 0일 경우
일반적으로 소켓 옵션을 보거나 클라이언트로부터 read한 값이 0일 경우
클라이언트에서 종료한 것으로 보는 것 같습니다.
int isDisconnected = 0; if( FD_ISSET( sockfd, &rset ) ) { if( getsockopt( sockfd, SOL_SOCKET, SO_ERROR, &errorval, &errorlen ) == -1 ) { fprintf(stderr, "getsocketopt error\n"); } IsDisconnected = 0; if( errorval == ECONNRESET || errorval == ETIMEDOUT || errorval == EHOSTUNREACH ) { IsDisconnected = 1; } result = read( sockfd, recvbuff, MAXLINE ); if( result <= 0 || IsDisconnected == 1 ) { //클라이언트 소켓 끊어졌군요... 처리해주시고 close(sockfd); } else { // 정상적으로 읽었군요. 읽은 값 처리해주시고... } }KT하이텔, 앱스 개발자
부연.
select에서 readfd가 선택되는 경우 중의 하나가 FIN을 받았을때입니다.
(즉, 저쪽에서 먼저 close했을때)
뭔가 있다고 해서 읽을려고 했는데 아무것도 없을뿐더러 에러도 아니라면,
저쪽에서 끊자는 것이니까 이쪽에서 close하면 됩니다.