Linux环境SOCKET编程3:压力测试
测试方法:使用epoll实现一个通用的服务器压力测试程序。
测试代码:
#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>#define CONNECT_NUM 10 //链接数量
#define IP_ADDR "127.0.0.1" //server ip
#define PORT 8080 //端口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 )
{epoll_event event;event.data.fd = fd;event.events = EPOLLOUT | EPOLLET | EPOLLERR;epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &event );setnonblocking( fd );
}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;
}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[] )
{int epoll_fd = epoll_create( 100 );//edit server connect number ,ip and portstart_conn( epoll_fd,CONNECT_NUM,IP_ADDR, PORT );epoll_event events[ 1000 ];char buffer[ 2048 ];while ( 1 ){int fds = epoll_wait( epoll_fd, events, 1000, 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 );}}}
}
参考:
1、《Linux高性能服务器编程》
Linux环境SOCKET编程3:压力测试相关推荐
- Linux环境SOCKET编程5:定时器接口timerfd
1.概述 timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景.timerfd是lin ...
- Linux环境SOCKET编程2:epoll分析
我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式,而ET模式只能通过一种方式.所以ET模式下能被唤醒的情况,LT模式下一定也能被唤醒.我们先来讨论特殊情况(ET模式),再来讨论 ...
- Linux环境SOCKET编程1:套接字
一.socket运行过程 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然 ...
- Linux下Socket编程
Linux下Socket编程 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...
- Linux的SOCKET编程 简单演示
转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源 ...
- asp.core api 通过socket和服务器通信发送udp_详解Linux的SOCKET编程
文章来自于 https://www.zhangshengrong.com/p/9Oabd95XdK/ PHP进阶学习交流QQ群:983229225 本篇文章对Linux的SOCKET编程进行了详细解释 ...
- LINUX下Socket编程 函数格式详解
你需要了解的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() ...
- Linux的SOCKET编程详解
Linux的SOCKET编程详解 一. 网络中进程之间如何通信 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统 ...
- Linux的SOCKET编程详解——非常叼
http://blog.csdn.net/hguisu/article/details/7445768/ 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Linux的SOCKE ...
最新文章
- ssh mysql环境搭建_搭建一个MySQL高可用架构集群环境
- MySQL误操作后如何快速恢复数据
- Android退出程序(三)——Android事件总线
- Vim杂记:Sublime的配色方案
- TypeScript 参数属性
- Albert launcher安装与使用
- 信息安全工程师笔记-大数据安全威胁与需求分析
- QString 字符编码
- Android 中的冷启动和热启动
- 1117 Eddington Number
- [安卓学习]AndroidManifest.xml文件内容详解
- Atitit.现实生活中最好使用的排序方法-----ati排序法总结
- 苹果cmsV10简约白色风格自适应模板
- 【场景化解决方案】金蝶凭证信息与OA审批集成
- 计算机与测控技术专业就业方向,东北电力大学测控技术与仪器专业就业前景
- ROS学习:launch文件编写
- 来来来,一起去看临泉王冲林岗的红枫叶
- 如果你是iPhone用户,要学会这样清理手机垃圾,减缓卡顿小妙招
- linux滚动升级版本,Linux发行基础滚动版本与标准版本 | MOS86
- princeton 本科cos318操作系统教程-1引言
热门文章
- 【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法
- 使用kNN算法实现简单的手写文字识别
- mysql停止更新时间_我如何更新这个MySQL查询以获取从开始、停止、暂停和恢复事件经过的总时间...
- flyway常用配置_flyway的使用
- html5制作线路图,HTML5画电路图
- 你可能没听过的 Java 8 中的 10 个特性
- RHEL6_yum本地源配置
- ado.net知识点博客网址
- java面试题 Object类的常见方法总结
- cni k8s 插件安装_使用kind来快速部署k8s环境