본문 바로가기
일반 네트워크

FD_ 매크로 함수

by [Akashic Records] 개발의선지자 2024. 9. 24.

FD_로 시작하는 매크로 함수들에 대해 포스트한다.

 

하나의 소켓에 대한 상태를 체크하고 싶더라도 fd_set이라는 구조체를 사용하여 소켓의 그룹을 구성한다.

그리고 FD_ZERO 나 FD_SET이라는 매크로 함수를 이용해 자신이 체크하고 싶은 소켓을 그룹에 포함시킨 후에 

select() 함수를 사용해야 한다.

 

파일 디스크립터(FD)는 socket API를 이용해 소켓 생성시 반환되는 정수값이다. FD는 같은 프로그램 내에서는 중복되지 않는다.

 

fd_set 구조체

: FD를 그룹 짓기 위해 사용

#define __FD_SETSIZE 1024
typedef long int __fd_mask;
#define __NFDBITS	(8 * (int) sizeof(__fd_mask));

typedef struct
{
	__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];

}fd_set;

 

 

  1. __FD_SETSIZE : #define을 사용하여 값 치환한 상수 값
  2. __fd_mast : typedef를 사용해 정의한 데이터 형식 , long int와 동일, mask란 이름은 비트 연산 시 사용하는 용어이기 때문이다.  FD 값이 고유 값이기에 그 값을 연산해서 비트 단위로 저장하기 때문이다.
  3. __NFDBITS : __fd_mask 데이터형의 비트 수를 의미 , 만약 __fd_mask가 4바이트 크기라면 __NFDBITS는 32비트를 의

 

FD 매크로 함수

 

1. FD_ZERO(fd_set rfds)

: fd_set으로 선언된 변수를 초기화(이 변수의 모든 비트 값을 0으로 만든다)

-> memset(&fd_set, 0 , sizeof(fd_set)) 과 동일

 

 

2.FD_SET(d, set)

: socket 값을 fd_set으로 선언된 변수에 추가 할 때 사용

socket에 저장된 정수값을 고유값으로 판단하여 fd_set 변수 해당 값에 할당된 비트를 1로 만든다.;

 

 

3.FD_CLR(d, set)

: rfds 변수에  추가했던 FD 값에 해당하는 비트를 0으로 만든다.

 

4.FD_ISSET(d, set)

: fd_set으로 선언된 rfds 변수에 특정 FD 값이 설정되어 있는지 확인한다.

 

일반적으로 아래와 같이 사용한다.

FD_ZERO

FD_SET

FD_ISSET

 

#include<sys/socket.h>
#include<sys/select.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>


void main()
{
	fd_set mask, mask_temp;
    int sock;
    int founded_num;
    int read_bytes;
    char buf[128];
    
    sock =  socket(AF_INET, SOCK_STREAM, 0);
    
    FD_ZERO(&mask);
    FD_SET(sock, &mask);
    
    for(;;)
    {
    	mask_temp = mask;
        founded_num = select(128, *mask_temp, (fd_set*)0, (fd_set*)0, &timeout);
        if(founded_num == 0)
        {
  				perror("select error");
        }
        
        if(FD_ISSET(sock, &mask_temp)
        {
        	read_bytes = read(sock, buf, sizeof(buf) -1);
            if(read_bytes == 0)
            {
  				perror("read error");
            }
        }
    }
}

 

 

 

 

출처 :   fd_set, FD_SET, FD_ZERO에 .. : 네이버블로그 (naver.com)