epoll示例

来源:互联网 发布:新闻发布网站源码 编辑:程序博客网 时间:2024/05/18 02:05


client 端:

#include <sched.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/epoll.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#include <assert.h>//#include <errno.h>#define SERV_PORT 5657#define SERV_ADDR "127.0.0.1"#define BUF_SIZE 1024*1024typedef struct client_message{#define MAX_NAME 10char name[MAX_NAME + 1];int age;unsigned short id;}client_message_t;int send_data(int fd, void* buf, int len){    assert(buf);    assert(fd >= 0);    int writenum;    writenum = write(fd, buf, len);    if (writenum < 0) {        perror("write fd fail\n");        return -1;    }    if (writenum == 0) {        printf("write 0 bytes");        return 0;    }    printf("write to server real send  %u bytes, should send %u bytes\n",         writenum, len);    close(fd);    }int connect_server(){    int client_fd;struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = inet_addr(SERV_ADDR);client_fd = socket(AF_INET, SOCK_STREAM, 0);if (client_fd < 0){fprintf(stderr, "create socket fail\n");return -1;}if (connect(client_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){fprintf(stderr, "connect to server fail\n");return -1;}    return client_fd;}void client_process(){    int client_fd;    char buf[BUF_SIZE] = {0};    struct client_message* message;    client_fd = connect_server();    if (client_fd < 0)        return;    message = (struct client_message*)malloc(sizeof(struct client_message));    if (message == NULL) {        printf("allocate message fail\n");        return;    }    memset(message, 0, sizeof(struct client_message));    strncpy(message->name, "Tom", sizeof(message->name));    message->name[sizeof(message->name) - 1] = '\0';    message->age = 22;    message->id = 3;    if (send_data(client_fd, message, sizeof(struct client_message))) {        printf("send to server fail\n");        goto err;    }err:    free(message);    message = NULL;}int main(){    client_process();}

server端:

#include <sched.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/epoll.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#define BUF_SIZE 1024*1024void do_connect(int fd){int readnum;char read_buf[BUF_SIZE];    int i = 0;fprintf(stderr, "start process fd %d\n", fd);readnum = read(fd, read_buf, sizeof(read_buf));if (readnum < 0) {fprintf(stderr, "read error\n");        close(fd);        return;}    if (readnum == 0) {        fprintf(stdout, "read nothing!\n");        close(fd);        return;    }    fprintf(stdout, "read %u bytes\n", readnum);    while (i < readnum) {        fprintf(stdout, "%02x ", read_buf[i]);        i++;        if (i % 16 == 0)            fprintf(stdout, "\n");    }    close(fd);}void epoll_process(){#define MAX_EVENTS 10#define LISTEN_PORT 5657struct epoll_event ev;struct epoll_event events[MAX_EVENTS];int listen_fd, conn_fd, epoll_fd;struct sockaddr_in addr, client_addr;int nfds;epoll_fd = epoll_create(10);if (epoll_fd < 0){fprintf(stderr, "epoll create fail\n");exit(1);}listen_fd = socket(AF_INET, SOCK_STREAM, 0);if (listen_fd < 0){fprintf(stderr, "create socket fail\n");exit(1);}addr.sin_family = AF_INET;addr.sin_addr.s_addr = 0;addr.sin_port = htons(LISTEN_PORT);    memset(&client_addr, 0, sizeof(client_addr));if (bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr))){fprintf(stderr, "bind fail\n");exit(1);}if (listen(listen_fd, 5)){perror("listen fail\n");exit(1);}    printf("server start...\n");ev.events = EPOLLIN;ev.data.fd = listen_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev) < 0){fprintf(stderr, "epoll add fd %d fail\n", listen_fd);exit(1);}while (1){int i;int addr_len = 1;nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);if (nfds < 0){fprintf(stderr, "epoll_fd wait fail\n");exit(1);}for (i = 0;i < nfds;i++){if (events[i].data.fd == listen_fd){conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr,&addr_len);if (conn_fd < 0){perror(" accept fail\n");exit(1);}//setnonblocking(conn_fd);ev.events = EPOLLIN | EPOLLET;ev.data.fd = conn_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &ev) < 0){fprintf(stderr, "epoll_ctl add fail\n");exit(1);}}else{do_connect(conn_fd);                printf("process client finish, exit!\n");                close(listen_fd);                exit(EXIT_SUCCESS);}}}}int main(int argc,char** argv, char** env){epoll_process();}


运行结果:


wireshark报文:




0 0
原创粉丝点击