반응형
FD_SET(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_SET(int fd, fd_set *set);
fd_set은 여러개의 fd(file descriptor)를 select(2) 함수에서 읽기/쓰기/오류에 대한 event발생 여부 체크 모록을 관리하고 select(2) 실행후에 event가 발생한 fd인지 여부를 기록하는 구조체입니다. FD_SET(2)은 fd_set에 fd를 추가합니다.
파라미터
fd
- set에 추가할 file descriptor
set
- fd를 추가할 fd_set
- read용/write용/예외용에 대한 set이 있으며, 각각의 set에 fd를 추가할 수 있습니다.
RETURN
없음
활용 예제
#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 응용
반응형
'C언어 header > sys | select.h' 카테고리의 다른 글
FD_ISSET(2) - fd가 set에 설정되어 있는 지 체크 (0) | 2019.09.29 |
---|---|
FD_CLEAR(2) - set에서 fd를 제외시킴 (0) | 2019.09.29 |
FD_ZERO(2) - fd_set 설정을 초기화 (0) | 2019.09.29 |
select(2) - 다중 입출력(multiplexing I/O) (0) | 2019.09.29 |