博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的epoll测试例子
阅读量:5275 次
发布时间:2019-06-14

本文共 2406 字,大约阅读时间需要 8 分钟。

一段简单的epoll测试例子,编译运行后可以直接用浏览器访问localhost来测试。

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 14 char content[] = "
Hello
TEST";15 char response[512];16 17 int18 rep_err(char *err)19 {20 fprintf(stderr, "%s\n", err);21 perror("ERROR");22 exit(-1);23 }24 25 int26 setnonblock(int fd)27 {28 if(fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK) < 0)29 return -1;30 return 0;31 }32 33 34 int35 main(int argc, char *argv[])36 {37 struct sockaddr_in servaddr, cliaddr;38 socklen_t clilen;39 uint32_t listenfd, connfd, efd, err, n, i;40 char buffer[1024];41 struct epoll_event ev, events[256];42 43 signal(SIGPIPE, SIG_IGN);44 45 sprintf(response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %zd\r\n\r\n%s", strlen(content), content);46 47 if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0)48 rep_err("create socket failed");49 50 bzero(&servaddr, sizeof(servaddr));51 servaddr.sin_family = AF_INET;52 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);53 servaddr.sin_port = htons(80);54 55 if((err = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) != 0)56 rep_err("bind host failed");57 58 if((err = listen(listenfd, 6)) != 0)59 rep_err("listen host failed");60 61 setnonblock(listenfd);62 63 efd = epoll_create(256);64 ev.data.fd = listenfd;65 ev.events = EPOLLIN | EPOLLET;66 epoll_ctl(efd, EPOLL_CTL_ADD, listenfd, &ev);67 68 for(;;)69 {70 n = epoll_wait(efd, events, 256, -1);71 for(i = 0; i < n; ++i)72 { 73 if(events[i].data.fd == listenfd)74 {75 clilen = sizeof(cliaddr);76 if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) <= 0)77 rep_err("accept connect failed");78 printf("CONNECT FROM %s , PORT: %d\n", 79 inet_ntop(AF_INET, &cliaddr.sin_addr, buffer, sizeof(buffer)),80 ntohs(cliaddr.sin_port));81 setnonblock(connfd);82 ev.data.fd = connfd;83 ev.events = EPOLLIN |EPOLLET;84 epoll_ctl(efd, EPOLL_CTL_ADD, connfd, &ev);85 }86 else87 {88 write(events[i].data.fd, response, strlen(response));89 write(events[i].data.fd, content, strlen(content));90 }91 }92 }93 return 0;94 }

 

 

posted on
2013-04-08 19:56 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/Zirx/archive/2013/04/08/3008727.html

你可能感兴趣的文章
C#控制管理VisualSVN Server
查看>>
警惕使用WebClient.DownloadFile(string uri,string filePath)方法
查看>>
[UML]UML系列——状态机图statechart diagram
查看>>
WPF制作的一个小功能,智能提示(IntelliSense)
查看>>
关于私有变量,静态私有变量
查看>>
Zen Coding css,html缩写替换大观 快速写出html,css
查看>>
JSON
查看>>
iOS实现三屏复用循环广告[从服务器请求的广告]
查看>>
LINUX修改文件权限 学习
查看>>
Vue+ElementUI适应IE浏览器
查看>>
PHP+MySQL登录注册,完整版,详细注释
查看>>
使用Xpath
查看>>
SDUT 2133 数据结构实验之栈三:后缀式求值
查看>>
CVE-2011-1473 tomcat
查看>>
Jar包可执行??
查看>>
Linux SVN搭建模式
查看>>
day3.网络基础之网络协议
查看>>
台式机 双显卡切换实战
查看>>
多异常处理
查看>>
第二版str_cli函数(select加阻塞I/O修订版)
查看>>