Epoll使用实例

  • 函数详情

    • atoi 将字符串转化为int
      int atoi (const char * str)
    • atol 将字符串转化为long
      long int atol ( const char * str )

  • 扩展实例

    Server_epoll.cc
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    
    //#include <memory.h>  //menset
    #include <sys/epoll.h>
    #include <fcntl.h>
    
    #define SOCKET_PORT 9999
    #define EPOLL_SIZE 10
    
    int main(int argc, char *argv[])
    {
        int server_fd;
        int client_fd;
        int epfd;
        
        struct sockaddr_in addr;
        memset(&addr,0,sizeof(addr));
        addr.sin_family = AF_INET;
        
        if (argc == 2){
            addr.sin_addr.s_addr = inet_addr(argv[1]);
            addr.sin_port = htons(SOCKET_PORT);
        }else if(argc==3){
            addr.sin_addr.s_addr = inet_addr(argv[1]);
            addr.sin_port = htons(atoi(argv[2]));
        }else{
            addr.sin_addr.s_addr = htonl(INADDR_ANY);
            addr.sin_port = htons(SOCKET_PORT); 
        }
        
        server_fd = socket(PF_INET,SOCK_STREAM,0);
        if (server_fd < 0){
            std::cout<<"Create Socket Errors, "<<server_fd<<std::endl;
            exit(server_fd);
        }
        
        if (bind(server_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) 
        {
            perror("bind error");
            return -1;
        }
        
        if (listen(server_fd, 10)<0)
        {
            perror("listen error");
            return -1;
        }else{
            printf("Stared the Socket: %s:%d\n",
                   inet_ntoa(addr.sin_addr),
                   ntohs(addr.sin_port));
        }
        
        epfd = epoll_create(EPOLL_SIZE);
        if (epfd < 0)
        {
            perror("Epoll Create");
            exit(-1);
        }
        
        struct epoll_event ev;
        struct epoll_event events[EPOLL_SIZE];
        ev.data.fd = server_fd;
        ev.events = EPOLLIN | EPOLLET;
        epoll_ctl(epfd, EPOLL_CTL_ADD, server_fd, &ev);
        fcntl(server_fd, F_SETFL, fcntl(server_fd, F_GETFD, 0)| O_NONBLOCK);
        
        while (1)
        {
            int epoll_events_count = epoll_wait(epfd, events, EPOLL_SIZE, -1);
            if (epoll_events_count < 0)
            {
                perror("epoll failed");
                break;
            }
            printf("epoll_events_count = %d\n", epoll_events_count);
            for (int i=0;i < epoll_events_count;i++)
            {
                if (events[i].data.fd==server_fd&&(events[i].events & EPOLLIN))
                {
                    struct sockaddr_in remote_addr;
                    
                    socklen_t socklen = sizeof(struct sockaddr_in);
                    client_fd = accept(server_fd, (struct sockaddr *)&remote_addr, &socklen);
                    if (client_fd < 0)
                    {
                        perror("accept error");
                    }
                    printf("client connection from: %s : % d(IP : port), "
                           "clientfd = %d \n",
                           inet_ntoa(remote_addr.sin_addr),
                           ntohs(remote_addr.sin_port),
                           client_fd);
                    
                    ev.data.fd = client_fd;
                    epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev);
                    
                    fcntl(client_fd, F_SETFL,
                          fcntl(client_fd, F_GETFD, 0)| O_NONBLOCK);
                    send(client_fd,"Welcome to My server",21,0);
                }else{ 
                    char buffer[1024];
                    int len;
                    if ((len=recv(events[i].data.fd,buffer,sizeof(buffer), 0))>0)
                    {
                        send(events[i].data.fd,"Welcome to My server\n",21,0);
                        printf("%s fd %d \n",buffer,events[i].data.fd);
                        
                        //close(client_fd);
                    }else{
                        printf("client offline with: "
                               "clientfd = %d \n",
                               events[i].data.fd);
                    }
                }
            }
        }
        close(server_fd);
        close(epfd);
        return 0;                                                                   
    }
    
    Client_epoll.cc
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    
    //#include <memory.h>  //menset
    #include <sys/epoll.h>
    #include <fcntl.h>
    
    #define EPOLL_SIZE 10
    
    int main(int argc, char *argv[])
    {
        int size;
        int client_fd;
        
        struct sockaddr_in addr;
        memset(&addr,0,sizeof(addr));
        addr.sin_family = AF_INET;
        
        if (argc == 3){
            addr.sin_addr.s_addr = inet_addr(argv[1]);
            addr.sin_port = htons(atoi(argv[2]));
        }else{
            printf("The host ip and port is falied.\n");
            exit(-1);
        }
        
        client_fd = socket(PF_INET,SOCK_STREAM,0);
        
        if (client_fd < 0){
            std::cout<<"Create Socket Errors, "<<client_fd<<std::endl;
            exit(client_fd);
        }
        
        size = connect(client_fd, (struct sockaddr *)&addr,
                       sizeof(struct sockaddr));
        if (size < 0)
        {
            perror("connect error");
        }
        printf("Connect client: %s:%d \n",inet_ntoa(addr.sin_addr),
               ntohs(addr.sin_port));
        
        int epfd;
        epfd = epoll_create(EPOLL_SIZE);
        struct epoll_event ev;
        
        ev.data.fd = client_fd;
        ev.events = EPOLLIN | EPOLLET;
        epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev);
        fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFD, 0)| O_NONBLOCK);
        
        char buffer[1024];
        struct epoll_event events[EPOLL_SIZE];
        
        int len;
        while (1)
        {
            int epoll_events_count = epoll_wait(epfd, events, EPOLL_SIZE, -1);
            if (epoll_events_count<0)
            {
                perror("Epoll wait");
                exit(-1);
            }
            
            for (int i=0;i<epoll_events_count;i++)
            {
                printf("client fd %d, event fd %d \n",client_fd,
                       events[i].data.fd);
                len = recv(client_fd, buffer, sizeof(buffer), 0);
                if (len > 0)
                {
                    printf("%s",buffer);
                }
                sleep(3);
                send(client_fd,"Welcome to My client",21,0);
            }
        }
        return 0;
    }
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,443评论 0 5
  • 下面为Daytime这个服务的源代码例子,同时兼容IPV6和IPV4的地址,最后部分有更多说明。 单播模式下的Se...
    天楚锐齿阅读 5,773评论 0 2
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    y角阅读 2,581评论 2 11
  • 系统与网络编程 select函数 select和pselect多用于I/O操作,他们见识多个文件描述符的集合,判断...
    I踏雪寻梅阅读 623评论 0 1
  • 1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和po...
    Daniel521阅读 697评论 0 1