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 ...
随机推荐
- SpringMVC如何接收application/json内容编码类型的参数?
在上代码之前,有必要先说说@ResquestBody注解的含义: 1.官方解释如下: Annotation indicating a method parameter should be bound ...
- NEC学习 ---- 模块 - tab[含标题]
简要介绍, 默认居左, Tab不定宽, “标题”和“更多”可删, 扩展类可以自由组合, 依赖于reset.css(之前的模块以及布局都依赖这个css) 那么这个效果是怎么实现的呢? CSS代码: . ...
- Boyer-Moore algorithm
http://www-igm.univ-mlv.fr/~lecroq/string/node14.html Main features performs the comparisons from ri ...
- youtube视频下载
开你的电脑,然后打开你的浏览器,浏览器可以是IE.Chrome.Firefox等等 在浏览器中输入这个网址:en.savefrom.net,点击Enter键,进入这个网页: 打开你需要下载的y ...
- JQ中的延迟对象deferred中的promise等的使用
一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...
- angularJs指令执行的机制==大概的三个阶段
第一阶段:加载阶段 angularJs要运行的话,需要去等待angular.js加载完成,加载完之后呢,angular就会去查找到ng-app这个指令,ng-app在每个应用里面只能出现一次, 它也就 ...
- OceanBase架构浅析(一)
http://www.cnblogs.com/LiJianBlog/p/4779934.html 简介 OceanBase是阿里集团研发的可扩展的关系数据库,实现了数千亿条记录.数百TB数据上的跨行跨 ...
- JQuery对象操作支持链式法则源码分析
JQuery链式法则 何为链式法则?先给出非链式写法的例子 //非链式写法 $("div").css("width", 45px); $("div&q ...
- final关键字用法总结
在java中,可能使用到final关键字修饰的有数据.方法和类. 一.final 修饰数据 有final修饰的数据是用来告诉编译器一块数据是恒定不变的,有时数据恒定不变是很有用的,比如: 1.一个永不 ...
- leetcode56. Merge Intervals
题目要求: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6 ...