UNP 학습_I/O 복용의poll 함수 반사 서버 구현
24100 단어 Linux 네트워크 프로그래밍
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) 수평 트리거만 지원합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UNP 학습_I/O 복용의poll 함수 반사 서버 구현UNP 학습_I/O 복용의poll 함수 반사 서버 구현 1. 함수 원형: 2. 구현 코드 3. 폴의 장단점 장점: (1) 여러 설명자가 준비될 때까지 기다릴 수 있습니다.(2)poll은 설명자 수량의 상한 제한이 없...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.