测试方法:使用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:压力测试相关推荐

  1. Linux环境SOCKET编程5:定时器接口timerfd

    1.概述 timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景.timerfd是lin ...

  2. Linux环境SOCKET编程2:epoll分析

    我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式,而ET模式只能通过一种方式.所以ET模式下能被唤醒的情况,LT模式下一定也能被唤醒.我们先来讨论特殊情况(ET模式),再来讨论 ...

  3. Linux环境SOCKET编程1:套接字

    一.socket运行过程 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然 ...

  4. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  5. Linux的SOCKET编程 简单演示

    转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源 ...

  6. asp.core api 通过socket和服务器通信发送udp_详解Linux的SOCKET编程

    文章来自于 https://www.zhangshengrong.com/p/9Oabd95XdK/ PHP进阶学习交流QQ群:983229225 本篇文章对Linux的SOCKET编程进行了详细解释 ...

  7. LINUX下Socket编程 函数格式详解

    你需要了解的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() ...

  8. Linux的SOCKET编程详解

    Linux的SOCKET编程详解 一. 网络中进程之间如何通信 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统 ...

  9. Linux的SOCKET编程详解——非常叼

    http://blog.csdn.net/hguisu/article/details/7445768/ 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Linux的SOCKE ...

最新文章

  1. ssh mysql环境搭建_搭建一个MySQL高可用架构集群环境
  2. MySQL误操作后如何快速恢复数据
  3. Android退出程序(三)——Android事件总线
  4. Vim杂记:Sublime的配色方案
  5. TypeScript 参数属性
  6. Albert launcher安装与使用
  7. 信息安全工程师笔记-大数据安全威胁与需求分析
  8. QString 字符编码
  9. Android 中的冷启动和热启动
  10. 1117 Eddington Number
  11. [安卓学习]AndroidManifest.xml文件内容详解
  12. Atitit.现实生活中最好使用的排序方法-----ati排序法总结
  13. 苹果cmsV10简约白色风格自适应模板
  14. 【场景化解决方案】金蝶凭证信息与OA审批集成
  15. 计算机与测控技术专业就业方向,东北电力大学测控技术与仪器专业就业前景
  16. ROS学习:launch文件编写
  17. 来来来,一起去看临泉王冲林岗的红枫叶
  18. 如果你是iPhone用户,要学会这样清理手机垃圾,减缓卡顿小妙招
  19. linux滚动升级版本,Linux发行基础滚动版本与标准版本 | MOS86
  20. princeton 本科cos318操作系统教程-1引言

热门文章

  1. 【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法
  2. 使用kNN算法实现简单的手写文字识别
  3. mysql停止更新时间_我如何更新这个MySQL查询以获取从开始、停止、暂停和恢复事件经过的总时间...
  4. flyway常用配置_flyway的使用
  5. html5制作线路图,HTML5画电路图
  6. 你可能没听过的 Java 8 中的 10 个特性
  7. RHEL6_yum本地源配置
  8. ado.net知识点博客网址
  9. java面试题 Object类的常见方法总结
  10. cni k8s 插件安装_使用kind来快速部署k8s环境