压力测试
来源:互联网 发布:java反射获取对象属性 编辑:程序博客网 时间:2024/05/01 15:18
一个通用的压力测试程序,
我也不知道是否通用,书上说是,抄下来学习学习
#include <stdlib.h>#include <stdio.h>#include <assert.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>#include <string.h>#include <strings.h>#include <stdbool.h>//每个客户连续不断地向服务器发送这个请求static const char* request = "GET http://localhost/index.html HTTP/1.1\r\nConnection: keep-alive\r\n\r\nxxxxxxxxxxxx";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;}void addfd( int epoll_fd, int fd ){ struct epoll_event event; event.data.fd = fd; event.events = EPOLLOUT | EPOLLET | EPOLLERR; epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &event ); setnonblocking( fd );}//向服务器写入len字节的数据bool write_nbytes( int sockfd, const char* buffer, int len ){ int bytes_write = 0; printf( "write out %d bytes to socket %d\n", len, sockfd ); while( 1 ) { bytes_write = send( sockfd, buffer, len, 0 ); if ( bytes_write == -1 ) { return false; } else if ( bytes_write == 0 ) { return false; } len -= bytes_write; buffer = buffer + bytes_write; if ( len <= 0 ) { return true; } } }//从服务器读取数据bool read_once( int sockfd, char* buffer, int len ){ int bytes_read = 0; memset( buffer, '\0', len ); bytes_read = recv( sockfd, buffer, len, 0 ); if ( bytes_read == -1 ) { return false; } else if ( bytes_read == 0 ) { return false; } printf( "read in %d bytes from socket %d with content: %s\n", bytes_read, sockfd, buffer ); return true;}//向服务器发起num个tcp连接,我们可以改变num来调整测试压力。void start_conn( int epoll_fd, int num, const char* ip, int port ){ int ret = 0; struct sockaddr_in address; bzero( &address, sizeof( address ) ); address.sin_family = AF_INET; inet_pton( AF_INET, ip, &address.sin_addr ); address.sin_port = htons( port ); for ( int i = 0; i < num; ++i ) { sleep( 1 ); int sockfd = socket( PF_INET, SOCK_STREAM, 0 ); printf( "create 1 sock\n" ); if( sockfd < 0 ) { continue; } if ( connect( sockfd, ( struct sockaddr* )&address, sizeof( address ) ) == 0 ) { printf( "build connection %d\n", i ); addfd( epoll_fd, sockfd ); } }}void close_conn( int epoll_fd, int sockfd ){ epoll_ctl( epoll_fd, EPOLL_CTL_DEL, sockfd, 0 ); close( sockfd );}int main( int argc, char* argv[] ){ assert( argc == 4 ); int epoll_fd = epoll_create( 100 ); start_conn( epoll_fd, atoi( argv[ 3 ] ), argv[1], atoi( argv[2] ) ); struct epoll_event events[ 10000 ]; char buffer[ 2048 ]; while ( 1 ) { int fds = epoll_wait( epoll_fd, events, 10000, 2000 ); for ( int i = 0; i < fds; i++ ) { int sockfd = events[i].data.fd; if ( events[i].events & EPOLLIN ) { if ( ! read_once( sockfd, buffer, 2048 ) ) { 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 ); } } }}
学习学习哈
等改天我用libevent写个试试看。
1 0
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- 压力测试
- C语言基础注意点
- 1103. Integer Factorization 解析
- 蓝桥杯2016愤怒的小鸟
- ViewPager实现简单的循环播放
- Java四种引用(强、软、弱、虚)整理
- 压力测试
- IE8兼容性分析
- windows编程链接时遇到error LNK2001 无法解析的外部符号_imp_timeGetTime@0
- Date 对象 之获取事件与制作倒计时
- 【HTML5学习笔记】7:查漏补缺1
- QT5.7交叉编译安装到arm
- LeetCode : Sqrt(x)
- poj2955(区间dp)
- import matplotlib.pyplot 错误