代码:

 /*
* 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实现压测工具的更多相关文章

  1. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  2. Http压测工具wrk使用指南【转】

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  3. Http 压测工具 wrk 基本使用

    Http 压测工具 wrk 基本使用 Intro wrk 是一款现代HTTP基准测试工具,能够在单个多核CPU上运行时产生显着负载.它将多线程设计与可扩展事件通知系统(如epoll和kqueue)结合 ...

  4. wrk压测工具使用

    介绍分为四部分 1.wrk简述 2.wrk安装 3.wrk运行参数 4.wrk高级用法 1.wrk简述 当使用ab做压测的时候发现,ab的客户端消耗很大,而且测试时性能较差,测试redis,sprin ...

  5. 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  6. web压测工具http_load原理分析

    一.前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ ...

  7. [软件测试]网站压测工具Webbench源码分析

    一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...

  8. python服务端多进程压测工具

    本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...

  9. 内存压测工具Memtester

    在做压力测试时,发现一个内存压测工具Memtester,可以随意设置内存占用大小,非常方便 下载地址:http://pyropus.ca/software/memtester/old-versions ...

随机推荐

  1. 如何防御“神器”Mimikatz窃取系统密码?

    Mimikatz是一款能够从Windows中获取内存,并且获取明文密码和NTLM哈希值的神器,本文将介绍如何防御这款软件获取密码. Mimikatz介绍 Mimikatz是一款能够从Windows认证 ...

  2. PHP如何通过SQL语句将数据写入MySQL数据库呢?

    1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...

  3. 安装XDEBUG步骤及问题

    echo PHPINFO(); 如果搜索中没找到XDEBUG, 则表示没安装XDEBUG; XDEBUG官方下载路径, https://xdebug.org/download.php 查看环境参数 我 ...

  4. Splay树-Codevs 1296 营业额统计

    Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

  5. phpexcel 内存溢出 优化

    最近我们公司的项目的在导出excel的时候偶尔出现内存溢出错误,经过测试发现当数据量大于5000条就出现这个问题(默认php.ini memory 是128M) Allowed memory size ...

  6. UINavigationBar 总结

    一.某个 ViewController 出现隐藏 NavigationBar - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear ...

  7. c语言-交换两个整数

    使用c来写一个函数来实现交换两个整数. 第一种 一般的方法,引用中间变量,方便快捷. void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = t ...

  8. Linux Samba服务器配置

    Linux系统默认已经安装了Samba,但是没有安装Samba服务: 1,先查看安装情况:rpm -qa|grep samba 根据系统的安装情况选择下载或者通过光驱安装所缺的rpm包. 我的安装情况 ...

  9. 白话学习MVC(八)Action的执行二

    一.概述 上篇博文<白话学习MVC(七)Action的执行一>介绍了ASP.NET MVC中Action的执行的简要流程,并且对TempData的运行机制进行了详细的分析,本篇来分析上一篇 ...

  10. spring_01

    1.框架 1.框架是解决什么问题的? 1.框架是用来解决代码冗余的问题 2.有利于团队的协作开发 3.框架是用来解决低耦合和高内聚的问题 4.解决健壮性和安全性 2.STRUTS2和hibernate ...