select()가 EBADF를 세팅할때 어떤 소켓이 닫혀있는지 어떻게 알아내나요?

ckebabo의 이미지

select()가 EBADF를 세팅할때 어떤 소켓이 닫혀있는지 어떻게 알아내나요?

대충 아래코드 형식으로 되어 있는데요...

for(;;) {
ret = select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
switch(ret) {
case -1: if(errno == EBADF) // 어떤 것이 잘못된건지 알아내는 부분
case 0: // timeout 처리
default: // 읽기동작
}
}

잘 통신하고 있다가...어떤 이유로 닫히게 된 소켓에 대해서 다른 처리를 하려고 하는데...그 소켓이 어떤 건지를 아는 방법을 잘 모르겠습니다.

rookey94의 이미지

아래 내용이 도움이 될시것 같아서....

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;
}
}
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.