UNP 학습_I/O 복용의poll 함수 반사 서버 구현

UNP 학습_I/O 복용의poll 함수 반사 서버 구현
1. 함수 원형:
#include
struct pollfd{
	int fd;// 
	short events;// 
	short revents;// 
};
int poll(struct pollfd *fds,nfds_t nfds,int timeout);
//fds:  
//nfds:  , +1。 fd 
//timeout: -1 :  ;  0 : ; >0 (ms)
// :I/O 

2. 구현 코드
// File Name: poll_server.c
// Author: AlexanderGan
// Created Time: Wed 29 Jul 2020 04:31:41 PM CST

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char* argv[]){
     if(argc < 2)
    {
        printf("eg: ./a.out IP port
"
); } int port = atoi(argv[1]); struct sockaddr_in serv_addr, client_addr; socklen_t serv_len = sizeof(serv_addr); socklen_t cli_len = sizeof(client_addr); // int lfd = socket(AF_INET,SOCK_STREAM,0); printf("lfd = %d
"
,lfd); // memset(&serv_addr,0,serv_len); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(port); // ip bind(lfd,(struct sockaddr*)&serv_addr,serv_len); // listen(lfd,36); printf("Start accept !
"
); //poll struct pollfd allfd[1024]; int max_index = 0; // for(int i = 0;i < 1024; i++){ allfd[i].fd = -1; } allfd[0].fd = lfd; allfd[0].events = POLLIN; while(1) { int i = 0; int ret = poll(allfd,max_index+1,-1); if(ret == -1) { printf("poll error!
"
); exit(1); } if(allfd[0].revents & POLLIN){ int cfd = accept(lfd,(struct sockaddr*)&client_addr,&cli_len); printf("======start======,cfd = %d
"
,cfd); //cfd poll for(i; i < 1024;++i){ if(allfd[i].fd == -1) { printf("i = %d
"
,i); allfd[i].fd = cfd; break; } } allfd[i].events = POLLIN; // max_index max_index = max_index < i ? i : max_index; printf("max_index = %d
"
,max_index); } // for(i = 1; i <= max_index; i++){ int fd = allfd[i].fd; printf("i = %d,fd = %d
"
,i,fd); if(fd == -1) continue; bool res = (allfd[i].revents & POLLIN); printf("res = %d
"
,(int)res); if(allfd[i].revents & POLLIN){ printf("recv!"); // char buf[1024] = {0}; int len = recv(fd,buf,sizeof(buf),0); printf("len == %d
"
, len); if(len == -1) { perror("recv error"); exit(1); } else if(len == 0) { allfd[i].fd = -1; close(fd); printf(" 。
"
); } else { printf("recv buf = %s
"
,buf); // for(int k = 0; k < len;++k) { buf[k] = toupper(buf[k]); } printf("buf toupper = %s
"
,buf); send(fd,buf,strlen(buf)+1,0); } } } } close(lfd); return 0 ; }

3. 폴의 장단점
장점: (1) 여러 설명자가 준비될 때까지 기다릴 수 있습니다.(2)poll은 설명자 수량의 상한 제한이 없다. 왜냐하면 내부 핵에서 그의 역행 선형 구조는 체인 테이블을 바탕으로 저장되기 때문이다.
단점: (1)poll을 호출할 때마다 fd 집합을 사용자 상태에서 내부 핵 상태로 복사해야 하는데 이 비용은 fd가 많을 때 매우 크다.(2) poll을 호출할 때마다 내부 핵에 전달되는 모든 fd가 필요합니다. 이 비용은 fd가 많을 때도 많습니다.(3)poll은 플랫폼을 뛰어넘을 수 없고 이식성이 떨어진다.(4) 수평 트리거만 지원합니다.

좋은 웹페이지 즐겨찾기