/*------------------------------------------------------------------------------------------------- gcc -o httpd httpd.c -lpthread author: wyezl 2006.4.28 ---------------------------------------------------------------------------------------------------*/
#include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <pthread.h> #include <errno.h>
#define PORT 8888 #define MAXFDS 5000 #define EVENTSIZE 100
#define BUFFER "HTTP/1.1 200 OK/r/nContent-Length: 5/r/nConnection: close/r/nContent-Type: text/html/r/n/r/nHello"
int epfd; void *serv_epoll(void *p); void setnonblocking(int fd) { int opts; opts=fcntl(fd, F_GETFL); if (opts < 0) { fprintf(stderr, "fcntl failed/n"); return; } opts = opts | O_NONBLOCK; if(fcntl(fd, F_SETFL, opts) < 0) { fprintf(stderr, "fcntl failed/n"); return; } return; }
int main(int argc, char *argv[]) { int fd, cfd,opt=1; struct epoll_event ev; struct sockaddr_in sin, cin; socklen_t sin_len = sizeof(struct sockaddr_in); pthread_t tid; pthread_attr_t attr;
epfd = epoll_create(MAXFDS); if ((fd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) { fprintf(stderr, "socket failed/n"); return -1; } setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*)&opt, sizeof(opt));
memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons((short)(PORT)); sin.sin_addr.s_addr = INADDR_ANY; if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) != 0) { fprintf(stderr, "bind failed/n"); return -1; } if (listen(fd, 32) != 0) { fprintf(stderr, "listen failed/n"); return -1; }
pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&tid, &attr, serv_epoll, NULL) != 0) { fprintf(stderr, "pthread_create failed/n"); return -1; }
while ((cfd = accept(fd, (struct sockaddr *)&cin, &sin_len)) > 0) { setnonblocking(cfd); ev.data.fd = cfd; ev.events = EPOLLIN | EPOLLET; epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev); //printf("connect from %s/n",inet_ntoa(cin.sin_addr)); //printf("cfd=%d/n",cfd); }
if (fd > 0) close(fd); return 0; }
void *serv_epoll(void *p) { int i, ret, cfd, nfds;; struct epoll_event ev,events[EVENTSIZE]; char buffer[512];
while (1) { nfds = epoll_wait(epfd, events, EVENTSIZE , -1); //printf("nfds ........... %d/n",nfds); for (i=0; i<nfds; i++) { if(events[i].events & EPOLLIN) { cfd = events[i].data.fd; ret = recv(cfd, buffer, sizeof(buffer),0); //printf("read ret..........= %d/n",ret);
ev.data.fd = cfd; ev.events = EPOLLOUT | EPOLLET; epoll_ctl(epfd, EPOLL_CTL_MOD, cfd, &ev); } else if(events[i].events & EPOLLOUT) { cfd = events[i].data.fd; ret = send(cfd, BUFFER, strlen(BUFFER), 0); //printf("send ret...........= %d/n", ret);
ev.data.fd = cfd; epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, &ev); //shutdown(cfd, 1); close(cfd);
} } } return NULL; }
下面是测试结果:
[yangjian2@localhost bin]$ ./ab -c 50 -n 10000 [url]http://202.108.xxx.xxx:8888/[/url] This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, [url]http://www.zeustech.net/[/url] Copyright (c) 1998-2002 The Apache Software Foundation, [url]http://www.apache.org/[/url]
Benchmarking 202.108.xxx.xxx (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Finished 10000 requests
Server Software: Server Hostname: 202.108.xxx.xxx Server Port: 8888
Document Path: / Document Length: 5 bytes
Concurrency Level: 50 Time taken for tests: 0.921732 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 872088 bytes HTML transferred: 50120 bytes Requests per second: 10849.14 [#/sec] (mean) Time per request: 4.609 [ms] (mean) Time per request: 0.092 [ms] (mean, across all concurrent requests) Transfer rat
|
|
相关推荐
赠送jar包:netty-transport-classes-epoll-4.1.74.Final.jar; 赠送原API文档:netty-transport-classes-epoll-4.1.74.Final-javadoc.jar; 赠送源代码:netty-transport-classes-epoll-4.1.74.Final-sources.jar;...
赠送jar包:netty-transport-classes-epoll-4.1.73.Final.jar; 赠送原API文档:netty-transport-classes-epoll-4.1.73.Final-javadoc.jar; 赠送源代码:netty-transport-classes-epoll-4.1.73.Final-sources.jar;...
epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht
linux socket tcp大并发 epoll使用教程 有关epoll的一切
在本部分我们实现一个较为好用实用的Epoll并发类, 由于实现代码与使用方式较简单, 因此就不在此赘述了, 下面我还使用了该类实现了一个基于Epoll的echo-server, 以演示该类的用法; 由于此处仅为Epoll类库的第一个...
Lua的epoll模块 更多细节,请查看sample.lua API: ok,err=epoll.setnonblocking(fd) 设置一个文件描述符非阻塞。 epfd,err=epoll.create() 创建一个 epoll 文件描述符。ok,err=epoll.register(epfd,fd,event...
linux epoll多线程编程 例子
下面文章在这段时间内研究 select/poll/epoll的内核实现的一点心得体会: select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll...
3)用到了epoll_event结构体中的 epoll_data.ptr 指针:把客户端的信息保存在 epoll_data.ptr 指针当中,当出现epoll事件的时候从该指针提取客户端信息,然后进行操作。 完整的c代码,可以直接使用gcc编译,编译...
服务器与客户端建立连接需要使用到一些接口,包括但不限于...epollepoll底层通过红黑树来描述,并维护一个ready list,将事件表中已经就绪的事件添加到这里,在使用epoll_wait调用时,仅观察这个list中有没有数据即可。
把epoll接收数据封装为接口形式供线程调用
linux系统下,利用epoll接收串口助手发来的数据并打印。
linux下完整的epoll多线程高并发服务器代码
Linux下通过epoll机制进行串口监听,当收到数据时,通过tcp进行数据转发给服务器
epoll反应堆模型代码,相对于网上普通的epoll模型增加了send recv 操作,并有详细的注释epoll反应堆
赠送jar包:netty-transport-classes-epoll-4.1.73.Final.jar; 赠送原API文档:netty-transport-classes-epoll-4.1.73.Final-javadoc.jar; 赠送源代码:netty-transport-classes-epoll-4.1.73.Final-sources.jar;...
它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议提供面向连接的可靠数据传输,而UDP协议则提供无连接的不可靠数据传输。在Linux网络编程中,开发者需要...
epoll多路IO转接机制:常用STL(vector, map)、文件读写(fstream)、jsoncpp解析json数据、MySQL基本操作; 实现的功能:注册、单点登录、登出、群聊(支持文本和图片的传送)、上线下线公告、在线用户记录;
FIFO配合管道PIPE,实现FIFO传递数据,PIPE触发epoll,异步IO效果
不管epoll管理的连接有多少,epoll_wait都会在常数时间内返回。而使用LT模式时,epoll_wait会去遍历所有连接的状态,只要某个连接的接收缓冲区中还有数据,epoll_wait就会报告。可以看出在LT模式下,epoll管理的连接...