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
- epoll示例
- epoll示例
- epoll示例
- epoll示例
- epoll示例
- epoll示例
- epoll 示例
- Epoll示例
- epoll服务器示例
- Epoll 使用示例
- epoll使用示例
- epoll 入门示例
- 关于epoll的示例
- Epoll使用示例
- Epoll示例代码
- linux epoll示例
- epoll 示例代码
- ace epoll使用源码示例
- C# override 的用法
- 【简单到死系列】人事系统
- 调试技巧10个
- 使用oledb获取Excel文件第一个工作表数据
- spark出现“org.apache.spark.SparkException: Task not serializable"
- epoll示例
- 《Neural networks and deep learning》概览
- netfilter 概要
- Linux进程地址空间 && 进程内存布局
- 【华为OJ】找出字符串中第一个只出现一次的字符
- Linux修改ip地址
- 选择排序法
- android客户端提交数据到服务器中文乱码三种解决方案
- 开启ubuntu下lamp的php错误提示