반응형

FD_ISSET(2)

/* According to POSIX.1-2001 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void FD_ISSET(int fd, fd_set *set);

fd_set은 여러개의 fd(file descriptor)를 select(2) 함수에서 읽기/쓰기/오류에 대한 event발생 여부 체크 모록을 관리하고 

 select(2) 실행후에는 event가 발생한 fd인지 여부를 기록하는 구조체입니다. set에 fd가 포함되어 있는 지를 확인하는 함수입니다. select(2)함수가 호출된 후에는 처리가 가능한 fd만 남게되므로 읽기 또는 쓰기 준비가 되어 있는 지 여부를 알 수 있습니다.

 

 

파라미터

fd
    - set에서 삭제할 file descriptor
set
    - 읽기/쓰기/오류에 대한 모니터링을 할 fd 목록을 관리하는 구조체

 

RETURN

0
    - fd가 set에 설정되지 않았습니다.
      select(2) 호출 후 FD_ISSET(2)을 호출한 경우이며 처리할 수 있는 상태가 아닙니다.

0이 아님
    - fd가 set에 설정되어 있습니다.
    - select(2) 호출 후 FD_ISSET(2)을 호출한 경우이면 처리할 수 있는 상태입니다.

 


활용 예제

 

#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval;
    int sock, sock1, sock2;
    int max_fd = -1;
    char buffer[4096];
    int size;

    ......

    if((sock = socket(....)) == -1) {
        return 1;
    }

    if(bind(sock, ....) == -1) {
        return 1;
    }

    ......

    sock1 = accept(...);
    sock2 = accept(...);

    ......

    FD_ZERO(&rfds);
    FD_SET(sock1, &rfds);
    
    max_fd = sock1;

    FD_SET(sock2, &rfds);

    //가장 큰 fd값을 알아야 함.
    if(max_fd < sock2) { 
        max_fd = sock2;
    }

    /* timeout을 5초로 설정함 */
    memset(&tv, 0x00, sizeof(tv));
    tv.tv_sec = 5;

    retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);

    if (retval == -1) {
        fprintf(stderr, "select error: %s\n", strerror(errno));
    } else if (retval == 0) {
        fprintf(stderr, "timeout이 발생하였습니다.\n");
    } else {
        if(FD_ISSET(sock1, &rfds) == 0) {
            if((size = read(sock1, buffer, 4096)) > 0) {
                buffer[size] = 0x00;
                printf("SOCK1: %s\n", buffer);
            }
        }
        if(FD_ISSET(sock2, &rfds) == 0) {
            if((size = read(sock2, buffer, 4096)) > 0) {
                buffer[size] = 0x00;
                printf("SOCK2: %s\n", buffer);
            }
        }
    }

    return 0;
}

 


see also : Socket 통신과 Socket 응용

 

 

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,