diff options
-rwxr-xr-x | server/server/headers.h | 5 | ||||
-rw-r--r-- | server/server/speedtest.cpp | 52 | ||||
-rw-r--r-- | server/server/speedtest.h | 22 |
3 files changed, 79 insertions, 0 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 new file mode 100644 index 0000000..8a694b8 --- /dev/null +++ b/server/server/speedtest.cpp @@ -0,0 +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 new file mode 100644 index 0000000..58b356f --- /dev/null +++ b/server/server/speedtest.h @@ -0,0 +1,22 @@ +#ifndef SPEEDTEST_H +#define SPEEDTEST_H + + + +class 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; +}; + + +#endif //SPEEDTEST_H
\ No newline at end of file |