diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2012-01-07 02:15:55 +0200 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2012-01-07 02:15:55 +0200 |
commit | 6970a39f3c81671d19f9191aca2f5a92ad46699c (patch) | |
tree | cdc5f47c0dacf3b6d5cc6ec2e45ae9d895593015 | |
parent | 94d056ac24a4e945dacd473fc8f18e82a70e5c39 (diff) |
speedtest class
-rwxr-xr-x | server/server/headers.h | 5 | ||||
-rw-r--r-- | server/server/speedtest.cpp | 50 | ||||
-rw-r--r-- | server/server/speedtest.h | 16 |
3 files changed, 68 insertions, 3 deletions
diff --git a/server/server/headers.h b/server/server/headers.h index 8592f9f..5f6a83e 100755 --- a/server/server/headers.h +++ b/server/server/headers.h @@ -21,6 +21,7 @@ #include <boost/random.hpp> #include <boost/nondet_random.hpp> #include <boost/date_time.hpp> +#include <boost/progress.hpp> #include <rapidxml.hpp> #include <rapidxml_print.hpp> @@ -28,11 +29,15 @@ #include <openssl/md5.h> #include <Poco/Process.h> + +#include <curl/curl.h> + #include "utilities.h" #include "main.h" #include "log.h" #include "config.h" #include "p_process.h" #include "p_xml.h" +#include "speedtest.h" #endif diff --git a/server/server/speedtest.cpp b/server/server/speedtest.cpp index f8e89b5..8a694b8 100644 --- a/server/server/speedtest.cpp +++ b/server/server/speedtest.cpp @@ -1,2 +1,52 @@ #include "headers.h" + +size_t speedtest::curl_data_callback(void *contents, size_t size, size_t nmemb, void *userp) //code from curl usage examples, may be slow +{ + size_t realsize = size * nmemb; + struct memory_struct *mem = (struct memory_struct *)userp; + + mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); + if (mem->memory == NULL) { + /* out of memory! */ + } + + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + return realsize; +} + + +size_t speedtest::test(const char* url) +{ + curl = curl_easy_init(); +/* if(!curl) + ;//handle error */ + memory_struct chunk; + chunk.memory = (char*)malloc(1); + chunk.size = 0; + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &speedtest::curl_data_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-speedtest/0.1"); + + timer.restart(); + + curl_easy_perform(curl); + + double time = timer.elapsed(); + + curl_easy_cleanup(curl); + + free(chunk.memory); + if(chunk.size) + { + if(time) + return chunk.size/time; + else + return chunk.size; + } + else + return 0; +} diff --git a/server/server/speedtest.h b/server/server/speedtest.h index 19b8cf5..58b356f 100644 --- a/server/server/speedtest.h +++ b/server/server/speedtest.h @@ -1,11 +1,21 @@ #ifndef SPEEDTEST_H #define SPEEDTEST_H + + class speedtest { - speedtest(); - size_t test(); - ~speedtest(); +public: + size_t test(const char* url); + speedtest() : curl(NULL){} +private: + struct memory_struct { + char *memory; + size_t size; + }; + static size_t curl_data_callback(void *contents, size_t size, size_t nmemb, void *userp); + boost::timer timer; + CURL *curl; }; |