Linux Server IO Model Epoll

Source: Internet
Author: User
Tags epoll

Epoll model

#include <unistd.h>#include<sys/types.h>/*Basic system data Types*/#include<sys/socket.h>/*Basic Socket Definitions*/#include<netinet/inch.h>/*sockaddr_in{} and other Internet Defns*/#include<arpa/inet.h>/*inet (3) Functions*/#include<sys/epoll.h>/*epoll function*/#include<fcntl.h>/*nonblocking*/#include<sys/resource.h>/*Setrlimit*/#include<stdlib.h>#include<errno.h>#include<stdio.h>#include<string.h>#defineMaxepollsize 10000#defineMAXLINE 10240intHandleintconnfd);intSetnonblocking (intsockfd) {    if(Fcntl (SOCKFD, F_SETFL, Fcntl (SOCKFD, F_GETFD,0)| O_nonblock) = =-1) {        return-1; }    return 0;}intMainintargcChar**argv) {    intServport =6888; intListenq =1024x768; intLISTENFD, CONNFD, KDPFD, Nfds, N, nread, Curfds,acceptcount =0; structsockaddr_in servaddr, cliaddr; socklen_t Socklen=sizeof(structsockaddr_in); structepoll_event ev; structepoll_event Events[maxepollsize]; structRlimit RT; CharBuf[maxline]; /*set the maximum number of files per process allowed to open*/Rt.rlim_max= Rt.rlim_cur =maxepollsize; if(Setrlimit (rlimit_nofile, &rt) = =-1) {perror ("Setrlimit Error"); return-1; } bzero (&AMP;SERVADDR,sizeof(SERVADDR)); Servaddr.sin_family=af_inet; Servaddr.sin_addr.s_addr=htonl (Inaddr_any); Servaddr.sin_port=htons (Servport); LISTENFD= Socket (Af_inet, Sock_stream,0); if(LISTENFD = =-1) {perror ("can ' t create socket file"); return-1; }    intopt =1; SetSockOpt (LISTENFD, Sol_socket, SO_REUSEADDR,&opt,sizeof(opt)); if(Setnonblocking (LISTENFD) <0) {perror ("Setnonblock Error"); }    if(Bind (LISTENFD, (structSOCKADDR *) &servaddr,sizeof(structSOCKADDR)) = =-1) {perror ("bind error"); return-1; }     if(Listen (LISTENFD, listenq) = =-1) {perror ("Listen error"); return-1; }    /*Create a Epoll handle and add the listener socket to the Epoll collection*/KDPFD=epoll_create (maxepollsize); Ev.events= Epollin |Epollet; EV.DATA.FD=LISTENFD; if(Epoll_ctl (KDPFD, Epoll_ctl_add, LISTENFD, &ev) <0) {fprintf (stderr,"epoll Set Insertion error:fd=%d\n", LISTENFD); return-1; } Curfds=1; printf ("epollserver startup,port%d, max connection is%d, backlog is%d\n", Servport, Maxepollsize, Listenq);  for (;;) {        /*wait for an event to occur*/Nfds= Epoll_wait (KDPFD, events, Curfds,-1); if(Nfds = =-1) {perror ("epoll_wait"); Continue; }        /*Handle All Events*/         for(n =0; n < Nfds; ++N) {if(EVENTS[N].DATA.FD = =LISTENFD) {CONNFD= Accept (LISTENFD, (structSOCKADDR *) &cliaddr,&Socklen); if(CONNFD <0) {perror ("Accept Error"); Continue; } sprintf (BUF,"Accept Form%s:%d\n", Inet_ntoa (cliaddr.sin_addr), cliaddr.sin_port); printf ("%d:%s", ++Acceptcount, BUF); if(Curfds >=maxepollsize) {fprintf (stderr,"too many connection, more than%d\n", maxepollsize);                    Close (CONNFD); Continue; }                 if(Setnonblocking (CONNFD) <0) {perror ("setnonblocking Error"); } ev.events= Epollin |Epollet; EV.DATA.FD=CONNFD; if(Epoll_ctl (KDPFD, Epoll_ctl_add, CONNFD, &ev) <0) {fprintf (stderr,"add socket '%d ' to Epoll failed:%s\n", CONNFD, Strerror (errno)); return-1; } Curfds++; Continue; }             //Handling client Requests            if(Handle (EVENTS[N].DATA.FD) <0) {epoll_ctl (KDPFD, Epoll_ctl_del, EVENTS[N].DATA.FD,&ev); Curfds--;    }}} close (LISTENFD); return 0;}intHandleintCONNFD) {    intnread; CharBuf[maxline]; Nread= Read (CONNFD, buf, MAXLINE);//Read Client socket stream    if(Nread = =0) {printf ("client Close the connection\n");        Close (CONNFD); return-1; }     if(Nread <0) {perror ("Read Error");        Close (CONNFD); return-1; } write (CONNFD, buf, nread);//Responding to clients    return 0;}

Linux Server IO Model Epoll

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.