Linux网络epoll模型

#define _GNU_SOURCE 1
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define DEF_STD_ERROR (-1)
#define DEF_BIND_PORT (10240)


#ifndef TRUE
typedef int BOOL;
#define TRUE 1
#define FALSE 0
#endif





int main(int argc,char *argv[])
{
        int ret;
        int sock;
        struct sockaddr_in addr;
        char buf[1024];
        int len;
        int epoll_id;
        struct epoll_event event;
        struct epoll_event ret_events[100];
        int i;
        int client;
        int count=0;
        //create socket
        sock = socket(AF_INET,SOCK_STREAM,0);
        if(sock == DEF_STD_ERROR)
        {
                printf("%d %s",ret,strerror(errno));
                return -1;
        }

        //init address
        addr.sin_family = AF_INET;
        addr.sin_port = htons(DEF_BIND_PORT);
        addr.sin_addr.s_addr = inet_addr("192.168.1.168");

        //bind
        ret = bind(sock,(struct sockaddr*)&addr,sizeof(addr));
        if(ret == DEF_STD_ERROR)
        {
                printf("%s",strerror(errno));
                close(sock);
                return -1;
        }

        //listen
        ret = listen(sock,5);
        if(ret == DEF_STD_ERROR)
        {
                printf("%s",strerror(errno));
                close(sock);
                return -1;
        }

        //create epoll
        epoll_id = epoll_create(100);

        //promote sock to epoll
        event.events = EPOLLIN;
		event.data.fd=sock;
        epoll_ctl(epoll_id,EPOLL_CTL_ADD,sock,&event);
        printf("listen socket [%d]\n",sock);
        //accept
        while(1)
        {
                //wait epoll
                ret = epoll_wait(epoll_id,ret_events,100,10);
                if(ret == 0)
                {
                        usleep(10);
                        continue;
                }
                else if(ret < 0)
                {
                        printf("%s\n",strerror(errno));
                        break;
                }

                //deal
                for(i = 0;i < ret;i++)
                {
                        if(EPOLLERR & ret_events[i].events)
                        {
                            epoll_ctl(epoll_id,EPOLL_CTL_DEL,ret_events[i].data.fd,NULL);
                            close(ret_events[i].data.fd);
                            printf("client:[%d] force quit!\n",ret_events[i].data.fd);
                        }
                        else if(EPOLLRDHUP & ret_events[i].events)
                        {
                            epoll_ctl(epoll_id,EPOLL_CTL_DEL,ret_events[i].data.fd,NULL);
                            close(ret_events[i].data.fd);
                            printf("client:[%d] gracefully quit!\n",ret_events[i].data.fd);

                        }
                        else if(EPOLLIN & ret_events[i].events)
                        {
                                //accept or recv
                                if(ret_events[i].data.fd == sock)
                                {
                                        //accept
                                        client = accept(sock,NULL,NULL);
                                        event.events = EPOLLIN | EPOLLERR | POLLRDHUP|EPOLLET;
                                        event.data.fd=client;
                                        epoll_ctl(epoll_id,EPOLL_CTL_ADD,client,&event);
                                }
                                else
                                {
                                        memset(buf,0,sizeof(buf));
                                        count=recv(ret_events[i].data.fd,buf,sizeof(buf),0);
                                        printf("client:[%d][%s]\n",ret_events[i].data.fd,buf);
                                        event.events = EPOLLOUT;
                                        event.data.fd=ret_events[i].data.fd;
                                        epoll_ctl(epoll_id,EPOLL_CTL_MOD/*xiu gai*/,ret_events[i].data.fd,&event);
                                }
                        }
                        else if(EPOLLOUT&ret_events[i].events)
                        {
                            send(ret_events[i].data.fd,buf,count,0);
                            event.events = EPOLLIN|EPOLLERR|EPOLLRDHUP|EPOLLET;
                            event.data.fd=ret_events[i].data.fd;
                            epoll_ctl(epoll_id,EPOLL_CTL_MOD,ret_events[i].data.fd,&event);

                        }
                }

        }
        //close
        close(sock);
        return 0;
  }

你可能感兴趣的:(网络)