zoukankan      html  css  js  c++  java
  • epoll服务器

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <sys/epoll.h>
    #define SERVER_PORT         (7778)
    #define EPOLL_MAX_NUM       (2048)
    #define BUFFER_MAX_LEN      (4096)
    char buffer[BUFFER_MAX_LEN];
    void str_toupper(char *str)
    {
        int i;
        for (i = 0; i < strlen(str); i ++) {
            str[i] = toupper(str[i]);
        }
    }
    int main(int argc, char **argv)
    {
        int listen_fd = 0;
        int client_fd = 0;
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;
        socklen_t           client_len;
        int epfd = 0;
        struct epoll_event event, *my_events;
        // socket
        listen_fd = socket(AF_INET, SOCK_STREAM, 0);
        // bind
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_addr.sin_port = htons(SERVER_PORT);
        bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
        // listen
        listen(listen_fd, 10);
        // epoll create
        epfd = epoll_create(EPOLL_MAX_NUM);
        if (epfd < 0) {
            perror("epoll create");
            goto END;
        }
        // listen_fd -> epoll
        event.events = EPOLLIN;
        event.data.fd = listen_fd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &event) < 0) {
            perror("epoll ctl add listen_fd ");
            goto END;
        }
        my_events = malloc(sizeof(struct epoll_event) * EPOLL_MAX_NUM);
        while (1) {
            // epoll wait
            int active_fds_cnt = epoll_wait(epfd, my_events, EPOLL_MAX_NUM, -1);
            int i = 0;
            for (i = 0; i < active_fds_cnt; i++) {
                // if fd == listen_fd
                if (my_events[i].data.fd == listen_fd) {
                    //accept
                    client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len);
                    if (client_fd < 0) {
                        perror("accept");
                        continue;
                    }
                    char ip[20];
                    printf("new connection[%s:%d]
    ", inet_ntop(AF_INET, &client_addr.sin_addr, ip, sizeof(ip)), ntohs(client_addr.sin_port));
                    event.events = EPOLLIN | EPOLLET;
                    event.data.fd = client_fd;
                    epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &event);
                }
                else if (my_events[i].events & EPOLLIN) {
                    printf("EPOLLIN
    ");
                    client_fd = my_events[i].data.fd;
                    // do read
                    buffer[0] = '';
                    int n = read(client_fd, buffer, 5);
                    if (n < 0) {
                        perror("read");
                        continue;
                    }
                    else if (n == 0) {
                        epoll_ctl(epfd, EPOLL_CTL_DEL, client_fd, &event);
                        close(client_fd);
                    }
                    else {
                        printf("[read]: %s
    ", buffer);
                        buffer[n] = '';
    #if 1
                        str_toupper(buffer);
                        write(client_fd, buffer, strlen(buffer));
                        printf("[write]: %s
    ", buffer);
                        memset(buffer, 0, BUFFER_MAX_LEN);
    #endif
    /*
                        event.events = EPOLLOUT;
                        event.data.fd = client_fd;
                        epoll_ctl(epfd, EPOLL_CTL_MOD, client_fd, &event);
    */
                    }
                }
                else if (my_events[i].events & EPOLLOUT) {
                    printf("EPOLLOUT
    ");
    /*
                    client_fd = my_events[i].data.fd;
                    str_toupper(buffer);
                    write(client_fd, buffer, strlen(buffer));
                    printf("[write]: %s
    ", buffer);
                    memset(buffer, 0, BUFFER_MAX_LEN);
                    event.events = EPOLLIN;
                    event.data.fd = client_fd;
                    epoll_ctl(epfd, EPOLL_CTL_MOD, client_fd, &event);
    */
                }
            }
        }
    END:
        close(epfd);
        close(listen_fd);
        return 0;
    }
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <strings.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define MAX_LINE (1024)
    #define SERVER_PORT (7778)
    void setnoblocking(int fd)
    {
        int opts = 0;
        opts = fcntl(fd, F_GETFL);
        opts = opts | O_NONBLOCK;
        fcntl(fd, F_SETFL);
    }
    int main(int argc, char **argv)
    {
        int  sockfd;
        char recvline[MAX_LINE + 1] = {0};
        struct sockaddr_in server_addr;
        if (argc != 2) {
            fprintf(stderr, "usage ./client <SERVER_IP>
    ");
            exit(0);
        }
        // 创建socket
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            fprintf(stderr, "socket error");
            exit(0);
        }
        // server addr 赋值
        bzero(&server_addr, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(SERVER_PORT);
        if (inet_pton(AF_INET, argv[1], &server_addr.sin_addr) <= 0) {
            fprintf(stderr, "inet_pton error for %s", argv[1]);
            exit(0);
        }
        // 链接服务端
        if (connect(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0) {
            perror("connect");
            fprintf(stderr, "connect error
    "); 
            exit(0);
        }
        setnoblocking(sockfd);
        char input[100];
        int n = 0;
        int count = 0;
        // 不断的从标准输入字符串
        while (fgets(input, 100, stdin) != NULL)
        {
            printf("[send] %s
    ", input);
            n = 0;
            // 把输入的字符串发送 到 服务器中去
            n = send(sockfd, input, strlen(input), 0);
            if (n < 0) {
                perror("send");
            }
            n = 0;
            count = 0;
            // 读取 服务器返回的数据
            while (1)
            {
                n = read(sockfd, recvline + count, MAX_LINE);
                if (n == MAX_LINE)
                {
                    count += n;
                    continue;
                }
                else if (n < 0){
                    perror("recv");
                    break;
                }
                else {
                    count += n;
                    recvline[count] = '';
                    printf("[recv] %s
    ", recvline);
                    break;
                }
            }
        }
        return 0;
    }

    原文:https://www.bookstack.cn/read/libevent/e8691fedd5788e20.md

     参考资料 http://www.voidcn.com/article/p-zhkxicif-bmm.html

  • 相关阅读:
    转载:C# 文件下载(WebClient)
    文档生成业务的商业机会
    Java代码编译和执行的整个过程
    (转)TransitionManager
    安装了phpmyadmin
    转:jQuery框架学习第一天:开始认识jQuery
    转:Http post和 Get的本质区别
    vim基本命令汇总
    jQuery框架学习第二天:jQuery中万能的选择器
    IE的hasLayout属性
  • 原文地址:https://www.cnblogs.com/byfei/p/14104132.html
Copyright © 2011-2022 走看看