summaryrefslogtreecommitdiff
path: root/Sockets/tests/stressclient.cpp
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@anytun.org>2008-04-12 11:38:42 +0000
committerOthmar Gsenger <otti@anytun.org>2008-04-12 11:38:42 +0000
commitfffd213c8cba2135afda493d797c41c10354770e (patch)
treebb5eea1b12871d8c3fed0e687d83be3e504d11b2 /Sockets/tests/stressclient.cpp
parentsvn cleanup (diff)
big svn cleanup
Diffstat (limited to 'Sockets/tests/stressclient.cpp')
-rw-r--r--Sockets/tests/stressclient.cpp516
1 files changed, 0 insertions, 516 deletions
diff --git a/Sockets/tests/stressclient.cpp b/Sockets/tests/stressclient.cpp
deleted file mode 100644
index 4187868..0000000
--- a/Sockets/tests/stressclient.cpp
+++ /dev/null
@@ -1,516 +0,0 @@
-/**
- ** \file stressclient.cpp
- ** \date 2006-10-02
- ** \author grymse@alhem.net
-**/
-/*
-Copyright (C) 2006 Anders Hedstrom
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifdef _WIN32
-#pragma warning(disable:4786)
-#endif
-#include <StdoutLog.h>
-#include <ListenSocket.h>
-#include <SocketHandler.h>
-#include <TcpSocket.h>
-#include <Utility.h>
-#ifndef _WIN32
-#include <signal.h>
-#include <stdint.h>
-#else
-typedef __int64 int64_t;
-#endif
-#include <HttpGetSocket.h>
-
-
-static double g_min_time = 10000;
-static double g_max_time = 0;
-static double g_tot_time = 0;
-static int g_ant = 0;
-static double g_min_time2 = 10000;
-static double g_max_time2 = 0;
-static double g_tot_time2 = 0;
-static int g_ant2 = 0;
-static bool gQuit = false;
-static size_t g_max_connections = 0;
-static std::string gHost = "localhost";
-static port_t gPort = 2222;
-static bool g_b_flood = false;
-static bool g_b_off = false;
-static bool g_b_limit = false;
-static int64_t gBytesIn = 0;
-static int64_t gBytesOut = 0;
-static bool g_b_repeat = false;
-static std::string g_data;
-static size_t g_data_size = 1024;
-static bool g_b_stop = false;
-#ifdef HAVE_OPENSSL
-static bool g_b_ssl = false;
-#endif
-static bool g_b_instant = false;
-static struct timeval g_t_start;
-
-
-/**
- * Return time difference between two struct timeval's, in seconds
- * \param t0 start time
- * \param t end time
- */
-double Diff(struct timeval t0,struct timeval t)
-{
- t.tv_sec -= t0.tv_sec;
- t.tv_usec -= t0.tv_usec;
- if (t.tv_usec < 0)
- {
- t.tv_usec += 1000000;
- t.tv_sec -= 1;
- }
- return t.tv_sec + (double)t.tv_usec / 1000000;
-}
-
-
-void gettime(struct timeval *p, struct timezone *)
-{
-#ifdef _WIN32
- FILETIME ft; // Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).
- GetSystemTimeAsFileTime(&ft);
- uint64_t tt;
- memcpy(&tt, &ft, sizeof(tt));
- tt /= 10;
- p->tv_sec = tt / 1000000;
- p->tv_usec = tt % 1000000;
-#else
- gettimeofday(p, NULL);
-#endif
-}
-
-
-void printreport()
-{
- struct timeval tv;
- gettime(&tv, NULL);
- double rt = Diff(g_t_start, tv);
- g_t_start = tv;
- //
- printf("\n");
- if (g_ant)
- printf("connect; ant: %5d min: %.4f max: %.4f med: %.4f\n", g_ant, g_min_time, g_max_time, g_tot_time / g_ant);
- if (g_ant2)
- printf("reply; ant: %5d min: %.4f max: %.4f med: %.4f\n", g_ant2, g_min_time2, g_max_time2, g_tot_time2 / g_ant2);
- double mbi = (double)gBytesIn / 1024;
- mbi /= 1024;
- mbi /= rt;
- double mbo = (double)gBytesOut / 1024;
- mbo /= 1024;
- mbo /= rt;
- printf("bytes in: %lld", gBytesIn);
- printf(" (%.2f MB/sec)", mbi);
- printf(" bytes out: %lld", gBytesOut);
- printf(" (%.2f MB/sec)", mbo);
- printf(" time: %.2f sec\n", rt);
-}
-
-
-void printreport_reset()
-{
- printreport();
- //
- g_min_time = 10000;
- g_max_time = 0;
- g_tot_time = 0;
- g_ant = 0;
- g_min_time2 = 10000;
- g_max_time2 = 0;
- g_tot_time2 = 0;
- g_ant2 = 0;
- gBytesIn = gBytesOut = 0;
-}
-
-
-class MySocket : public TcpSocket
-{
-public:
- MySocket(ISocketHandler& h,bool one) : TcpSocket(h), m_b_client(false), m_b_one(one), m_b_created(false), m_b_active(false) {
- gettime(&m_create, NULL);
- SetLineProtocol();
-#ifdef HAVE_OPENSSL
- if (g_b_ssl)
- EnableSSL();
-#endif
- if (g_max_connections && !m_b_one && Handler().GetCount() >= g_max_connections)
- {
- fprintf(stderr, "\nConnection limit reached: %d, continuing in single connection stress mode\n", (int)g_max_connections);
- if (g_b_off)
- printreport_reset();
- g_b_limit = true;
- m_b_one = true;
- //
- g_b_flood = g_b_repeat;
- }
- if (!m_b_one && Handler().GetCount() >= FD_SETSIZE - 17)
- {
- fprintf(stderr, "\nFD_SETSIZE connection limit reached: %d, continuing in single connection stress mode\n", (int)Handler().GetCount());
- if (g_b_off)
- printreport_reset();
- g_b_limit = true;
- m_b_one = true;
- //
- g_b_flood = g_b_repeat;
- }
- }
- ~MySocket() {
- }
-
- void OnConnect() {
- gettime(&m_connect, NULL);
- m_b_active = true;
- {
- double tconnect = Diff(m_create, m_connect);
- //
- g_min_time = tconnect < g_min_time ? tconnect : g_min_time;
- g_max_time = tconnect > g_max_time ? tconnect : g_max_time;
- g_tot_time += tconnect;
- g_ant += 1;
- }
- SendBlock();
- m_b_client = true;
- }
-
- void SendBlock() {
- gettime(&m_send, NULL);
- Send(g_data + "\n");
- }
-
- void OnLine(const std::string& line) {
- gettime(&m_reply, NULL);
- m_b_active = true;
- {
- double treply = Diff(m_send, m_reply);
- //
- g_min_time2 = treply < g_min_time2 ? treply : g_min_time2;
- g_max_time2 = treply > g_max_time2 ? treply : g_max_time2;
- g_tot_time2 += treply;
- g_ant2 += 1;
- }
- //
- if (line != g_data)
- {
- fprintf(stderr, "\n%s\n%s\n", line.c_str(), g_data.c_str());
- fprintf(stderr, "(reply did not match data - exiting)\n");
- exit(-1);
- }
- //
- gBytesIn += GetBytesReceived(true);
- gBytesOut += GetBytesSent(true);
- if (m_b_one)
- {
- SetCloseAndDelete();
- }
- else
- if (g_b_repeat && g_b_limit)
- {
- SendBlock();
- }
- // add another
- if (!m_b_created && (!g_b_limit || !g_b_off) && !g_b_instant)
- {
- MySocket *p = new MySocket(Handler(), m_b_one);
- p -> SetDeleteByHandler();
- p -> Open(gHost, gPort);
- Handler().Add(p);
- m_b_created = true;
- }
- }
-
- bool IsActive() {
- bool b = m_b_active;
- m_b_active = false;
- return b;
- }
-
-private:
- bool m_b_client;
- bool m_b_one;
- bool m_b_created;
- bool m_b_active;
- struct timeval m_create;
- struct timeval m_connect;
- struct timeval m_send;
- struct timeval m_reply;
-};
-
-
-class MyHttpSocket : public HttpGetSocket
-{
-public:
- MyHttpSocket(ISocketHandler& h,const std::string& url) : HttpGetSocket(h,url), m_url(url) {
- gettime(&m_create, NULL);
- AddResponseHeader("content-length", Utility::l2string(g_data_size));
- }
- ~MyHttpSocket() {}
-
- void OnConnect() {
- gettime(&m_connect, NULL);
- {
- double tconnect = Diff(m_create, m_connect);
- //
- g_min_time = tconnect < g_min_time ? tconnect : g_min_time;
- g_max_time = tconnect > g_max_time ? tconnect : g_max_time;
- g_tot_time += tconnect;
- g_ant += 1;
- }
- gettime(&m_send, NULL);
-
- // send request header
- HttpGetSocket::OnConnect();
-
- // send body
- Send(g_data);
- }
-
- void OnContent() {
- gettime(&m_reply, NULL);
- {
- double treply = Diff(m_send, m_reply);
- //
- g_min_time2 = treply < g_min_time2 ? treply : g_min_time2;
- g_max_time2 = treply > g_max_time2 ? treply : g_max_time2;
- g_tot_time2 += treply;
- g_ant2 += 1;
- }
- CreateNew();
- }
- void CreateNew() {
- if (g_b_off)
- return;
- MyHttpSocket *p = new MyHttpSocket(Handler(), m_url);
- p -> SetDeleteByHandler();
- Handler().Add(p);
- SetCloseAndDelete();
- }
-
-private:
- std::string m_url;
- struct timeval m_create;
- struct timeval m_connect;
- struct timeval m_send;
- struct timeval m_reply;
-};
-
-
-#ifndef _WIN32
-void sigint(int)
-{
- printreport();
- gQuit = true;
-}
-
-
-void sigusr1(int)
-{
- g_b_flood = true;
-}
-
-
-void sigusr2(int)
-{
- printreport_reset();
-}
-#endif
-
-
-class MyHandler : public SocketHandler
-{
-public:
- MyHandler() : SocketHandler() {
- }
- MyHandler(StdoutLog *p) : SocketHandler(p) {
- }
- ~MyHandler() {
- }
- void Flood() {
- for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++)
- {
- Socket *p0 = it -> second;
- MySocket *p = dynamic_cast<MySocket *>(p0);
- if (p)
- {
- p -> SendBlock();
- }
- }
- }
- void Report() {
- int ant = 0;
- int act = 0;
- for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++)
- {
- MySocket *p = dynamic_cast<MySocket *>(it -> second);
- if (p)
- {
- ant++;
- if (p -> IsActive())
- {
- act++;
- }
- }
- }
- printf("Number of //stress// sockets: %d Active: %d\n", ant, act);
- }
-};
-
-
-int main(int argc,char *argv[])
-{
- bool many = false;
- bool one = false;
- bool enableLog = false;
- bool http = false;
- std::string url;
- time_t report_period = 10;
- for (int i = 1; i < argc; i++)
- {
- if (!strcmp(argv[i], "-many"))
- many = true;
- if (!strcmp(argv[i], "-one"))
- one = true;
- if (*argv[i] == '-' && strlen(argv[i]) > 1 && isdigit(argv[i][1]) )
- g_max_connections = atoi(argv[i] + 1);
- if (!strcmp(argv[i], "-host") && i < argc - 1)
- gHost = argv[++i];
- if (!strcmp(argv[i], "-port") && i < argc - 1)
- gPort = atoi(argv[++i]);
- if (!strcmp(argv[i], "-off"))
- g_b_off = true;
- if (!strcmp(argv[i], "-repeat"))
- g_b_repeat = true;
- if (!strcmp(argv[i], "-size") && i < argc - 1)
- g_data_size = atoi(argv[++i]);
- if (!strcmp(argv[i], "-log"))
- enableLog = true;
- if (!strcmp(argv[i], "-time") && i < argc - 1)
- report_period = atoi(argv[++i]);
- if (!strcmp(argv[i], "-stop"))
- g_b_stop = true;
-#ifdef HAVE_OPENSSL
- if (!strcmp(argv[i], "-ssl"))
- g_b_ssl = true;
-#endif
- if (!strcmp(argv[i], "-instant"))
- g_b_instant = true;
- if (!strcmp(argv[i], "-http"))
- http = true;
- if (!strcmp(argv[i], "-url") && i < argc - 1)
- url = argv[++i];
- }
- if (argc < 2 || (!many && !one && !g_max_connections && !http) )
- {
- printf("Usage: %s [mode] [options]\n", *argv);
- printf(" Modes (only use one of these):\n");
- printf(" -many start max number of connections\n");
- printf(" -one open - close - repeat\n");
- printf(" -nn open nn connections, then start -one mode\n");
- printf(" -http send/receive http request/response\n");
- printf(" Options:\n");
- printf(" -host xx host to connect to\n");
- printf(" -port nn port number to connection to\n");
- printf(" -off turn off new connections when connection limit reached\n");
- printf(" -repeat send new block when reply is received\n");
- printf(" -size nn size of block to send, default is 1024 bytes\n");
- printf(" -log enable debug log\n");
- printf(" -time nn time between reports, default 10s\n");
- printf(" -stop stop after time elapsed\n");
- printf(" -instant create all sockets at once\n");
-#ifdef HAVE_OPENSSL
- printf(" -ssl use ssl\n");
-#endif
- printf(" -url xx url to use in http mode (default http://<host>:<port>/)\n");
- exit(-1);
- }
- fprintf(stderr, "Using data size: %d bytes\n", (int)g_data_size);
- std::string chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- while (g_data.size() < g_data_size)
- {
- g_data += chars[rand() % chars.size()];
- }
-#ifndef _WIN32
- signal(SIGINT, sigint);
- signal(SIGUSR1, sigusr1);
- signal(SIGUSR2, sigusr2);
- signal(SIGPIPE, SIG_IGN);
-#endif
- StdoutLog *log = enableLog ? new StdoutLog() : NULL;
- MyHandler h(log);
- if (http)
- {
- if (!url.size())
- {
- url = "http://" + gHost + ":" + Utility::l2string(gPort) + "/";
- }
- MyHttpSocket *s = new MyHttpSocket(h, url);
- s -> SetDeleteByHandler();
- h.Add(s);
- }
- else
- if (g_b_instant)
- {
- for (size_t i = 0; i < g_max_connections; i++)
- {
- MySocket *s = new MySocket(h, one);
- s -> SetDeleteByHandler();
- s -> Open(gHost, gPort);
- h.Add(s);
- }
- g_b_limit = true;
- }
- else
- {
- MySocket *s = new MySocket(h, one);
- s -> SetDeleteByHandler();
- s -> Open(gHost, gPort);
- h.Add(s);
- }
- time_t t = time(NULL);
- gettime(&g_t_start, NULL);
- while (!gQuit)
- {
- h.Select(1, 0);
- if (g_b_flood)
- {
- fprintf(stderr, "\nFlooding\n");
- h.Flood();
- g_b_flood = false;
- }
- if (time(NULL) - t >= report_period) // report
- {
- t = time(NULL);
- printreport_reset();
- h.Report();
- if (g_b_stop)
- {
- gQuit = true;
- }
- }
- }
- fprintf(stderr, "\nExiting...\n");
- if (log)
- {
-// delete log;
- }
- return 0;
-}
-
-