select에 대해...

살자의 이미지

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를 하면 어떻게 체크를 해야 하는지여?
고수님들의 조언 부탁드립니다.

pynoos의 이미지

살자 wrote:
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를 하면 어떻게 체크를 해야 하는지여?
고수님들의 조언 부탁드립니다.

close 해도 select 되어 내려오게 되며, read, recv 에서 0 을 return 합니다.

최피디의 이미지

일반적으로 소켓 옵션을 보거나 클라이언트로부터 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하이텔, 앱스 개발자

june8th의 이미지

select에서 readfd가 선택되는 경우 중의 하나가 FIN을 받았을때입니다.
(즉, 저쪽에서 먼저 close했을때)

뭔가 있다고 해서 읽을려고 했는데 아무것도 없을뿐더러 에러도 아니라면,
저쪽에서 끊자는 것이니까 이쪽에서 close하면 됩니다.