select()가 EBADF를 세팅할때 어떤 소켓이 닫혀있는지 어떻게 알아내나요?
글쓴이: ckebabo / 작성시간: 월, 2008/11/24 - 12:56오후
select()가 EBADF를 세팅할때 어떤 소켓이 닫혀있는지 어떻게 알아내나요?
대충 아래코드 형식으로 되어 있는데요...
for(;;) { ret = select(FD_SETSIZE, &testfds, NULL, NULL, NULL); switch(ret) { case -1: if(errno == EBADF) // 어떤 것이 잘못된건지 알아내는 부분 case 0: // timeout 처리 default: // 읽기동작 } }
잘 통신하고 있다가...어떤 이유로 닫히게 된 소켓에 대해서 다른 처리를 하려고 하는데...그 소켓이 어떤 건지를 아는 방법을 잘 모르겠습니다.
Forums:
제가 예전에 어디선가 받은 소스가 있어서 올려 봅니다.
아래 내용이 도움이 될시것 같아서....
while(1)
{
allfds = readfds;
fd_num = select(maxfd + 1 , &allfds, (fd_set *)0,
(fd_set *)0, NULL);
// 만약 소켓 파일지사자에 연결(읽기)이 들어온다면
// accept 한다.
if (FD_ISSET(server_sockfd, &allfds))
{
client_len = sizeof(clientaddr);
// accept 한다.
client_sockfd = accept(server_sockfd,
(struct sockaddr *)&clientaddr, &client_len);
// client 배열에 현재 연결된 client_sockfd 를
// 입력한다.
for (i = 0; i < FD_SETSIZE; i++)
{
if (client[i] < 0)
{
client[i] = client_sockfd;
printf("%d : %d\n", i, client_sockfd);
break;
}
}
// FD_SETSIZE 를 초과해서 client 가 접근할경우
// 연결을 종료한다.
if (i == FD_SETSIZE)
{
close(sockfd);
client[i] = -1;
}
// fd_set 에 등록한다.
FD_SET(client_sockfd,&readfds);
if (client_sockfd > maxfd)
maxfd = client_sockfd;
if (i > maxi)
maxi = i;
if (--fd_num <= 0)
continue;
}
// client 배열에 입력된 fd 중
// 연결이된 (-1 이아닌) fd 에 대해서
// 읽을 데이타가 있는지 검사한후
// 읽을 데이타가 있으면 처리한다.
for (i = 0; i <= maxi; i++)
{
if ((sockfd = client[i]) < 0)
{
continue;
}
printf("maxi %d\n", maxi);
if (FD_ISSET(sockfd, &allfds))
{
// 파일 stream pointer 을 처음으로 돌린다.
rewind(fp);
memset(buf, 0x00, 255);
if (read(sockfd, buf, 255) <= 0)
{
close(sockfd);
FD_CLR(sockfd, &readfds);
client[i] = -1;
}
else
{
// client 가 quit 를 입력하면
// 연결을 종료시킨다.
if (strncmp(buf, "quit", 4) ==0)
{
write(sockfd, "bye bye\n", 8);
close(sockfd);
FD_CLR(sockfd, &readfds);
client[i] = -1;
break;
}
while(fgets(line, 255, fp) != NULL)
{
if (strstr(line, buf) != NULL)
write(sockfd, line, 255);
memset(line, 0x00, 255);
}
write(sockfd, "end", 255);
}
if (--fd_num <= 0)
break;
}
}
}
댓글 달기