epoll实现压测工具
代码:
/*
* g++ -o stress_test ./stress_test.cpp
*/ #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> static const char *request = "GET / HTTP/1.1\r\nHost: 192.168.1.5\r\nConnection: keep-alive\r\n\r\n"; int setnonblocking(int fd)
{
int old_option = fcntl(fd, F_GETFL);
int new_option = old_option | O_NONBLOCK;
fcntl(fd, F_SETFL, new_option); return old_option;
} int add_fd(int epoll_fd, int fd)
{
struct epoll_event event;
event.events = EPOLLOUT | EPOLLET | EPOLLERR;
event.data.fd = fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
setnonblocking(fd);
} bool write_nbytes(int sockfd, const char *buffer, int len)
{
int bytes_write = ;
printf("write out %d bytes to socket %d\n", len, sockfd);
while()
{
bytes_write = send(sockfd, buffer, len, );
if (bytes_write == -)
{
printf("send failed, errno[%d], error[%s]\n", errno, strerror(errno));
return false;
}
else if (bytes_write == )
{
printf("send 0 bytes\n");
return false;
} len -= bytes_write;
buffer = buffer + bytes_write;
if (len <= )
{
return true;
}
}
} bool read_once(int sockfd, char *buffer, int len)
{
int bytes_read = ;
memset(buffer, '\0', len);
bytes_read = recv(sockfd, buffer, len, );
if (bytes_read == -)
{
printf("recv failed, errno[%d], error[%s]\n", errno, strerror(errno));
return false;
}
else if (bytes_read == )
{
printf("recv 0 bytes\n");
return false;
}
printf("read in %d bytes from socket %d\n", bytes_read, sockfd); return true;
} int start_conn(int epoll_fd, const char *ip, int port, int num)
{
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_port = htons(port); socklen_t len = sizeof(addr);
for (int i = ; i < num; ++i)
{
sleep();
int fd = socket(AF_INET, SOCK_STREAM, );
if (fd == -)
{
printf("socket failed, errno[%d], error[%s]\n", errno, strerror(errno));
continue;
} if (connect(fd, (struct sockaddr*)&addr, len) == )
{
printf("build connection %d\n", i);
add_fd(epoll_fd, fd);
}
else
{
printf("connect failed, errno[%d], error[%s]\n", errno, strerror(errno));
continue;
}
}
} int close_conn(int epoll_fd, int fd)
{
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd, NULL); printf("close socket[%d]\n", fd);
close(fd);
} int main(int argc, char **argv)
{
if (argc != )
{
printf("usage:stress_test ip port num\n");
exit(-);
} int epoll_fd = epoll_create();
start_conn(epoll_fd, argv[], atoi(argv[]), atoi(argv[]));
epoll_event events[];
char buffer[];
while ()
{
int fds = epoll_wait(epoll_fd, events, , );
for (int i = ; i < fds; ++i)
{
int sockfd = events[i].data.fd;
if (events[i].events & EPOLLIN)
{
if (!read_once(sockfd, buffer, ))
{
close_conn(epoll_fd, sockfd);
} struct epoll_event event;
event.events = EPOLLOUT | EPOLLET | EPOLLERR;
event.data.fd = sockfd;
epoll_ctl(epoll_fd, EPOLL_CTL_MOD, sockfd, &event);
}
else if (events[i].events & EPOLLOUT)
{
if (!write_nbytes(sockfd, request, strlen(request)))
{
close_conn(epoll_fd, sockfd);
} struct epoll_event event;
event.events = EPOLLIN | EPOLLET | EPOLLERR;
event.data.fd = sockfd;
epoll_ctl(epoll_fd, EPOLL_CTL_MOD, sockfd, &event);
}
else if (events[i].events & EPOLLERR)
{
close_conn(epoll_fd, sockfd);
}
}
} return ;
}
epoll实现压测工具的更多相关文章
- Http压测工具wrk使用指南
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- Http压测工具wrk使用指南【转】
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- Http 压测工具 wrk 基本使用
Http 压测工具 wrk 基本使用 Intro wrk 是一款现代HTTP基准测试工具,能够在单个多核CPU上运行时产生显着负载.它将多线程设计与可扩展事件通知系统(如epoll和kqueue)结合 ...
- wrk压测工具使用
介绍分为四部分 1.wrk简述 2.wrk安装 3.wrk运行参数 4.wrk高级用法 1.wrk简述 当使用ab做压测的时候发现,ab的客户端消耗很大,而且测试时性能较差,测试redis,sprin ...
- 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- web压测工具http_load原理分析
一.前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ ...
- [软件测试]网站压测工具Webbench源码分析
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
- python服务端多进程压测工具
本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...
- 内存压测工具Memtester
在做压力测试时,发现一个内存压测工具Memtester,可以随意设置内存占用大小,非常方便 下载地址:http://pyropus.ca/software/memtester/old-versions ...
随机推荐
- log4net 配置应用
(一). WinForm 或者 WPF 中的配置和应用 <?xml version="1.0" encoding="utf-8" ?> <co ...
- AppStore审核
应用被拒分为两种:Binary Rejected 和 Metadata Rejected.前者需要重新上传应用并且重新排队,后者只需要修改信息,不需要重新上传应用. 1.应用内包含检查更新功能 iOS ...
- VS 调试
Vs 单步调试 在vs中的单步调试: 调试重要的几个键: F9在当前光标所在的行下断点,如果当前行已经有断点,则取消断点. F5调试状态运行程序,程序执行到有断点的地方会停下来. F10单步执行程序. ...
- Window7 驱动编程环境配置
1. 安装VS2010,WDK7.60(GRMWDK_EN_7600_1) 2. 新建VC 控制台项目(选择为空项目) 3. 新建项目配置“driver” ,点击下拉按钮-点击(配置管理器) 输 ...
- EmguCV 阈值化
一.public static double cvThreshold( IntPtr src, IntPtr dst, double threshold, double maxValue, //Max ...
- 使用 JavaScript 实现栈
1.栈的基本操作 function Stack() { //使用数组保存栈元素 var items = []; //添加新元素到栈顶(相当于数组的末尾) this.push = function(el ...
- 通过方法名(字符串)执行Objective-C方法
SEL selector = NSSelectorFromString(@"方法名"); if ([self respondsToSelector:selector]){ //判断 ...
- The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character.
http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html MySQL 5.7 Reference Manual / ... / ...
- Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...
- Elasticsearch 配置
Elasticsearch 配置 Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展 ...