서버 설계구현방법
서버 모델 최소화(select, epoll, iopc, multi process) + 기능(받은 정보를 가지고 무엇을 어떻게 처리할 것인가? 예>echo)
구조체
1.
struct book{
} a;
2.
struct {
} a;
3.
Struct student{
};
typedef struct student student;
student mystudent;
4.
typedef struct {
} software;
software visual;
5.
typedef union epoll_data{
} epoll_data_t;
epoll_data_t data;
select의 단점
1. 전체 파일디스크립터가 나타나는 배열에 생성되어 검사의 대상이 되는 파일디스크립터만 1로 표시하여
일일히 손으로 배열에 넣어 놓아야 함
2. 변화가 있는 파일디스크립터 뿐 아니라 변화가 없는 파일디스크립터까지 나타나 있는 배열을 받아서
일일히 for문을 통해서 1로 표시된변화가 생긴 파일디스크립터가 무엇인지 찾아야 함
운영체제에 공통적으로 있는 select함수
운영체제별로 커널에서 select함수를 발전시킨 여러 함수들이 존재
Linux => epoll
Windows => iocp
epoll의 전체구조
epoll 인스턴스 생성 함수
#include <sys/epoll.h>
int epoll_create(int size);
성공시 epoll 파일 디스크립터, 실패시 -1 반환
size : epoll 인스턴스의 크기 정보
epoll 인스턴스에 관찰대상이 되는 파일 디스크립터 등록 함수
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
성공시 0, 실패시 -1 반환
epfd : 관찰대상을 등록할 epoll 인스턴스의 파일 디스크립트
op : 관찰대상의 추가, 삭제 또는 변경여부 지정
fd : 등록할 관찰대상의 파일 디스크립터
event : 관찰대상의 관찰 이벤트 유형
사건별로 변화가 생긴 파일 디스크립터에 대한 정보를 얻는 함수
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
성공시 이벤트가 발생한 파일 디스크립터의 수, 실패시 -1 반환
epfd : 이벤트 발생의 관찰영역인 epoll 인스턴스의 파일 디스크립터
events : 이벤트가 발생한 파일 디스크립터가 채워질 버퍼의 주소 값
maxevents : 두 번째 인자로 전달된 주소 값의 버퍼에 등록 가능한 최대 이벤트 수
timeout : 1/1000초 단위의 대기시간, -1 전달 시, 이벤트가 발샐 할 때까지 무한 대기
엣지 트리거와 레벨 트리거
epoll은 기본적으로 레벨 트리거를 사용
엣지 트리거를 사용하기 위한 설정
event.ebents = EPOLLIN | EIPOLLET;
엣지 트리거 기반의 서버 구현을 위해서 알아야 할 것 2가지
1. 변수 errno을 이용한 오류의 원인을 확인하는 방법
read함수는 입력버퍼가 비어서 더 이상 읽어 들일 데이터가 없을 때 -1을 반환하고 이 때 errno에는 상수 EAGAIN가 저장
2. 넌-블로킹(non-blocking) IO를 위한 소켓의 특성을 변경하는 방법
리눅스에서 파일의 특성을 변경 및 참조하는 함수
#include <fcntl.h>
int fcntl(int filedes, int cmd, ~);
성공 시 매개변수 cmd에 따른 값, 실패 시 -1반환
filedes : 특성 변경의 대상이 되는 파일의 파일 디스크립터 전달
cmd : 함수호출의 목적에 해당되는 정보 전달
파일(소켓)을 넌-블로킹 모드로 변경하기 위한 방법
int flag = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flag|O_NONBLOCK);
레벨 트리거
엣지 트리거