多路IO复用epoll模型

epoll相对于select的优点:

1.首先监听的文件描述符不在受限于1024个而且是Lniux下独有的

2.当用户量比较活跃的时候效率比较高、

3.不在反复的轮询监听遍历所有的文件描述符

4.不用来回的在用户态和内核态之间转换 

多路IO复用epoll模型_第1张图片

 

/**********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define PORT 8899

void sys_error(char *ptr){
    perror(ptr);
    exit(1);
}

int main(int argc,char* argv[]){
    int lfd=socket(AF_INET,SOCK_STREAM,0);
    if(lfd==-1){
        sys_error("sock error");
    }
    struct sockaddr_in server,client;
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr=htonl(0);
    //端口复用
    int optval=-1;
    setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void*)&optval,sizeof(optval));
    
    int ret=bind(lfd,(struct sockaddr*)&server,sizeof(server));
    if(ret==-1){
        sys_error("bind error");
    }    
    ret=listen(lfd,64);
    if(ret==-1){
    	sys_error("listen error");
    }
    //以上完成了服务器端套接字的初始化和绑定以及监听
    
    socklen_t addrlen=sizeof(client);
    char buf[1024];
    
    //epoll
    struct epoll_event event,events[1025];
    int epfd= epoll_create(64);
    event.events=EPOLLIN;
    event.data.fd=lfd;
    epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&event);   

    while(1){
        int epoll_ret=epoll_wait(epfd,events,1025,-1);            
        if(epoll_ret<0){
            sys_error("epoll_wait error");
        }
        for(int i=0;i

你可能感兴趣的:(服务器,网络编程)