epoll实现简单echo服务器
来源:互联网 发布:淘宝买书有什么好店铺 编辑:程序博客网 时间:2024/05/16 15:04
好久没写过博客了,之前写博客纯属是为了记录,防止再遇到同样的问题一时想不起来,可以查查博客。然后发现印象笔记好像挺好用,然后就懒得写博客了。。。
最近感觉心态变了,写博客当自己学习过程的分享吧。
这篇博客内容不深,甚至是烂大街的东西,纯属是表达一下我学习的思路,希望可以给和我一样的新手一些学习的思路,写的不好的也请勿喷,谢谢
epoll的概念,还有什么与select、poll等的区别,优缺点,请自行搜索引擎,本人自认为还没到那水平,没法说明。
Linux编程,我认为,很重要的技能之一就是要学会是用man page(别跟我说英语不好巴拉巴拉的,吃得苦中苦,方为人上人),就比如本博文中要用到epoll,直接在终端中输入:
//$是终端指示符$man epoll
然后就出现了各种关于epoll的说明,什么DESCRIPTION, EXAMPLE,Questions and Answers啊,等等,啃,耐心的啃完,看不懂就查,查到懂(反正我是这么过来)。
从说明中可以看到,epoll主要就是,epoll_create1,epoll_ctl,epoll_wait这几个函数,还有就是ET、LT等,这时候就可以相应的查看函数的具体信息了:
$man epoll_reate1
又是各种说明,还能怎样,继续啃咯。。。
对别的函数进行同样的操作,行了,结果就出来了。。。
同时恭喜你向着大神方向又进了一步。。。
加油!!!
附上代码,也可到github.com/guanlaolin/echo 上获取代码(建议,因为我可能会修改代码)
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/epoll.h>#include <time.h>const int SERVER_PORT = 8000;const char SERVER_ADDR[] = "127.0.0.1";const int MAX_CLIENT = 100;const int MAX_SIZE = 1024;int main(){ //definiton int sock,client_sock; char buff[MAX_SIZE]; sockaddr_in server_addr,client_addr; epoll_event event,events[MAX_CLIENT]; //initialaziton bzero(&server_addr, sizeof(sockaddr_in)); bzero(&client_addr, sizeof(client_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); sock = socket(AF_INET, SOCK_STREAM, 0); if ( -1 == sock ) { perror("socket error"); return -1; } if (bind( sock, (sockaddr *)&server_addr, sizeof(sockaddr)) == -1) { perror("bind error"); return -1; } if ( listen( sock, MAX_CLIENT) == -1) { perror("listen error"); return -1; } //epoll begin //创建epoll int epfd = epoll_create1(0); if (-1 == epfd) { perror("epoll create"); return -1; } //添加sock到epoll,监听连接事件 bzero(&event, sizeof(epoll_event)); event.events = EPOLLIN; event.data.fd = sock; if (epoll_ctl(epfd, EPOLL_CTL_ADD, sock, &event) == -1) { perror("epoll ctl"); return -1; } for(;;) { int nfds = epoll_wait(epfd, events, MAX_CLIENT, -1); if (-1 == nfds) { perror("epoll wait"); continue; } for( int i = 0; i < nfds; ++i) { if (events[i].data.fd == sock) //有连接 { //accept socklen_t client_addr_size = sizeof(sockaddr); client_sock = accept(sock, (sockaddr *)&client_addr, &client_addr_size); if (-1 == client_sock) { perror("accept error"); continue; } printf("accept client:%s:%u\n",inet_ntoa(client_addr.sin_addr), ntohl(client_addr.sin_port)); //将client注册到epoll bzero(&event, sizeof(epoll_event)); event.events = EPOLLIN; event.data.fd = client_sock; if (epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock, &event) == -1) { perror("epoll ctl"); continue; } }else if (events[i].events & EPOLLIN) //读事件 { //读取数据 if (read(events[i].data.fd, buff, MAX_SIZE) == -1) { perror("read error"); continue; } printf("Read data from client:%s\n", buff); //设置为可写 //将client注册到epoll bzero(&event, sizeof(epoll_event)); event.events = EPOLLOUT; event.data.fd = events[i].data.fd; if (epoll_ctl(epfd, EPOLL_CTL_MOD, events[i].data.fd, &event) == -1) { perror("epoll ctl"); continue; } }else if (events[i].events & EPOLLOUT) //写事件 { //网客户端写入当前时间 time_t t = time(NULL); if ( (time_t)-1 == t) { perror("time"); continue; } char *now = asctime(gmtime(&t)); if (write( events[i].data.fd, now, strlen(now)) == -1) { perror("write error"); continue; } //设置为可读 //将client注册到epoll bzero(&event, sizeof(epoll_event)); event.events = EPOLLIN; event.data.fd = events[i].data.fd; if (epoll_ctl(epfd, EPOLL_CTL_MOD, events[i].data.fd, &event) == -1) { perror("epoll ctl"); continue; } }else if(events[i].events & EPOLLHUP) { //删除 bzero(&event, sizeof(epoll_event)); event.events = EPOLLHUP; if (epoll_ctl(epfd,EPOLL_CTL_DEL, events[i].data.fd, &event) == -1) { perror("epoll ctl"); continue; } printf("客户端关闭\n"); } else { printf("未实现的处理事件:%d\n",events[i].events); continue; } } } close(epfd); close(client_sock); close(sock); return 0;}
阅读全文
1 0
- epoll实现简单echo服务器
- 用epoll实现异步的Echo服务器
- Linux下实现简单Echo中继服务器
- 多路转接-EPOLL 及简单的EPOLL服务器实现
- 关于epoll服务器反馈的简单实现
- 用Epoll实现简单C++服务器
- Windows平台基于多进程的echo服务器简单实现
- 简单的echo服务器与客户端的实现
- [UNIX网络编程] sun rpc实现的简单echo服务器
- socket实现简单的echo应答服务器和客户端
- 采用epoll实现echo server和client
- epoll实现echo server和client
- 简单的echo服务器程序
- 基于epoll实现的一个简单web服务器
- Epoll模型服务器实现
- epoll实现web服务器
- epoll服务器代码实现
- select 实现 tcp echo 服务器
- Vue.js Mixins 混入使用
- 盘点卖iPhone必须做的准备工作
- 移动端布局方法
- 8.03讨论会
- tcp与udp的区别
- epoll实现简单echo服务器
- Jenkins check-out strategy
- 关于两个APP之间的跳转实现手机联系人展示
- 关于ajax提交表单的问题
- centos下mysql配置
- Unity后处理实现物体外描边
- nginx 部署angular项目
- NFS服务器不能挂载问题终极解决办法
- 发送定长宝解决网络粘包问题