diff --git a/libpear/libpear_speedtest/libpear_get_client.h b/libpear/libpear_speedtest/libpear_get_client.h index eeb71d6e9b073e016811c5b178b3d85ff7fc8102..a83b9a0af3f2cd292f8707604cb71b4c346f5ac3 100644 --- a/libpear/libpear_speedtest/libpear_get_client.h +++ b/libpear/libpear_speedtest/libpear_get_client.h @@ -6,6 +6,11 @@ #define PEAR_SPEEDTEST_ISP_LEN 64 #define PEAR_SPEEDTEST_COUNTRY_LEN 32 +typedef struct ThreadConfig +{ + int threadsCount; /* number of threads */ + int length; /* testlength? */ +} THREADCONFIG_T; typedef struct { char ip[PEAR_SPEEDTEST_IP_LEN]; @@ -14,6 +19,8 @@ typedef struct { int isp_n; // 1->mobile, 2->unicom, 3->telecom char isp[PEAR_SPEEDTEST_ISP_LEN]; char country[PEAR_SPEEDTEST_COUNTRY_LEN]; + THREADCONFIG_T uploadThreadConfig; + THREADCONFIG_T downloadThreadConfig; }pear_speedtest_client_info_t; diff --git a/libpear/libpear_speedtest/libpear_get_server.c b/libpear/libpear_speedtest/libpear_get_server.c index e02df752ac6648eff046f22e082fc685599dd1ab..7d913e938029198da8e8119cf2ff568fac65021d 100644 --- a/libpear/libpear_speedtest/libpear_get_server.c +++ b/libpear/libpear_speedtest/libpear_get_server.c @@ -3,6 +3,8 @@ #include #include #include +#include + #include "pear_curl.h" #include "pear_json.h" @@ -10,152 +12,175 @@ #include "libpear_get_header.h" #include "libpear_get_server.h" - -#define R 6371 -#define PI 3.1415926536 -#define TO_RAD (PI / 180) - +#define R 6371 +#define PI 3.1415926536 +#define TO_RAD (PI / 180) static double pear_speedtest_calc_distance(double lat1, double lon1, double lat2, double lon2) { - double dx, dy, dz, a, b; - lon1 -= lon2; - lon1 *= TO_RAD, lat1 *= TO_RAD, lat2 *= TO_RAD; - - dz = sin(lat1) - sin(lat2); - dx = cos(lon1) * cos(lat1) - cos(lat2); - dy = sin(lon1) * cos(lat1); - a = (dx * dx + dy * dy + dz * dz); - b = sqrt(a) / 2; - #ifdef USE_ASIN - return 2 * R * asin(b); - #else - return 2 * R * atan2(b, sqrt(1 - b * b)); - #endif + double dx, dy, dz, a, b; + lon1 -= lon2; + lon1 *= TO_RAD, lat1 *= TO_RAD, lat2 *= TO_RAD; + + dz = sin(lat1) - sin(lat2); + dx = cos(lon1) * cos(lat1) - cos(lat2); + dy = sin(lon1) * cos(lat1); + a = (dx * dx + dy * dy + dz * dz); + b = sqrt(a) / 2; +#ifdef USE_ASIN + return 2 * R * asin(b); +#else + return 2 * R * atan2(b, sqrt(1 - b * b)); +#endif } - -#define PEAR_SPEEDTEST_COPY_SERVERINFO(dest, src) do { \ - strcpy(dest.sponsor, src.sponsor); \ - strcpy(dest.url_upload, src.url_upload); \ - strcpy(dest.url_download, src.url_download); \ - dest.lat = src.lat; \ - dest.lon = src.lon; \ - dest.dis = src.dis; \ - } while(0) - - -#define PEAR_SPEEDTEST_COPY_SERVERINFO_CN(dest, src) do { \ - strcpy(dest.operator, src.operator); \ - strcpy(dest.url_upload, src.url_upload); \ - strcpy(dest.url_download, src.url_download); \ - dest.lat = src.lat; \ - dest.lon = src.lon; \ - dest.dis = src.dis; \ - } while(0) - +#define PEAR_SPEEDTEST_COPY_SERVERINFO(dest, src) \ + do \ + { \ + strcpy(dest.sponsor, src.sponsor); \ + strcpy(dest.url_upload, src.url_upload); \ + strcpy(dest.url_download, src.url_download); \ + dest.lat = src.lat; \ + dest.lon = src.lon; \ + dest.dis = src.dis; \ + } while (0) + +#define PEAR_SPEEDTEST_COPY_SERVERINFO_CN(dest, src) \ + do \ + { \ + strcpy(dest.operator, src.operator); \ + strcpy(dest.url_upload, src.url_upload); \ + strcpy(dest.url_download, src.url_download); \ + dest.lat = src.lat; \ + dest.lon = src.lon; \ + dest.dis = src.dis; \ + } while (0) // void pear_speedtest_init_server_info(pear_speedtest_server_info_t *server_info, int server_num) // { // memset(server_info, 0, sizeof(pear_speedtest_server_info_t) * server_num); // } +bool pear_str_in(const char* str, char** s, int s_num) { + for (int i = 0; i < s_num; i++) { + if (strcmp(str, s[i]) == 0) { + return true; + } + } + return false; +} - -int pear_speedtest_get_some_server(pear_speedtest_client_info_t *client_info, - pear_speedtest_server_info_t *server_info, int server_num, char *what_is_my_country, int debug) +int pear_speedtest_get_some_server(pear_speedtest_client_info_t *client_info, + pear_speedtest_server_info_t *server_info, int server_num, char **what_is_my_country, int c_num,int debug) { - char *header[] = { pear_speedtest_header_info.user_agent, "Cache-Control: no-cache", NULL}; - - if (!debug) { - pear_download_file("GET", "http://c.speedtest.net/speedtest-servers-static.php", header, NULL, 0, 30, 300, "/tmp/.pear_speedtest_servers.php"); + char *header[] = {pear_speedtest_header_info.user_agent, "Cache-Control: no-cache", NULL}; + int real_num = 0; + if (!debug) + { + pear_download_file("GET", "http://c.speedtest.net/speedtest-servers-static.php", header, NULL, 0, 30, 300, "/tmp/.pear_speedtest_servers.php"); } memset(server_info, 0, sizeof(pear_speedtest_server_info_t) * server_num); node_t *root = roxml_load_doc("/tmp/.pear_speedtest_servers.php"); - if(root == NULL) { + if (root == NULL) + { fprintf(stderr, "roxml_load_doc failed\n"); - goto failed_to_release_buffer; + pear_download_file("GET", "https://cdn.jsdelivr.net/gh/PearLab/speedtest@latest/nodes.xml", header, NULL, 0, 30, 300, "/tmp/.pear_speedtest_servers.php"); + root = roxml_load_doc("/tmp/.pear_speedtest_servers.php"); + if (root == NULL) { + goto failed_to_release_buffer; + } } // find first server node // node_t *server = roxml_get_chld(root, NULL, 0); - while(server != NULL) { + while (server != NULL) + { char server_name[32] = {0}; roxml_get_name(server, server_name, 32); - if (!strcmp(server_name, "server")) { break; } + if (!strcmp(server_name, "server")) + { + break; + } server = roxml_get_chld(server, NULL, 0); } - if(server == NULL) { + if (server == NULL) + { goto failed_to_release_xml; } - // country limit - // - char type_country[16] = {0}; - if (what_is_my_country) { - strcpy(type_country, what_is_my_country); - } else { strcpy(type_country, "China"); } - // find min distance servers // - while(server != NULL) { + while (server != NULL) + { char country[64] = {0}; node_t *attr_country = roxml_get_attr(server, "country", 0); - if (NULL == attr_country) goto failed_to_release_xml; + if (NULL == attr_country) + goto failed_to_release_xml; char *country_string = roxml_get_content(attr_country, 0, 0, 0); - if (NULL == country_string) goto failed_to_release_xml; + if (NULL == country_string) + goto failed_to_release_xml; strcpy(country, country_string); free(country_string); - - if(!strcmp(country, type_country)) { - pear_speedtest_server_info_t *max_distance_server_info = NULL; - pear_speedtest_server_info_t s_info; + if (pear_str_in(country, what_is_my_country, c_num)) + { + pear_speedtest_server_info_t *max_distance_server_info = NULL; + pear_speedtest_server_info_t s_info; // sponsor // node_t *attr_sponsor = roxml_get_attr(server, "sponsor", 0); - if (NULL == attr_sponsor) goto failed_to_release_xml; + if (NULL == attr_sponsor) + goto failed_to_release_xml; char *sponsor_string = roxml_get_content(attr_sponsor, 0, 0, 0); - if (NULL == sponsor_string) goto failed_to_release_xml; + if (NULL == sponsor_string) + goto failed_to_release_xml; strncpy(s_info.sponsor, sponsor_string, PEAR_SPEEDTEST_SPONSOR_LEN); free(sponsor_string); // carrieroperator // (China Mobile Group XinJiang, China Unicom Heilongjiang, China Telecom) // - switch (client_info->isp_n) { + if (strcmp(country, "China") == 0) { + switch (client_info->isp_n) + { case 1: - if (!strcasestr(s_info.sponsor, "mobile")) { + if (!strcasestr(s_info.sponsor, "mobile")) + { goto next_one; } break; case 2: - if (!strcasestr(s_info.sponsor, "unicom")) { + if (!strcasestr(s_info.sponsor, "unicom")) + { goto next_one; } break; case 3: - if (!strcasestr(s_info.sponsor, "telecom")) { + if (!strcasestr(s_info.sponsor, "telecom")) + { goto next_one; } break; default: break; + } } // url // node_t *attr_url = roxml_get_attr(server, "url", 0); - if (NULL == attr_url) goto failed_to_release_xml; + if (NULL == attr_url) + goto failed_to_release_xml; char *url_string = roxml_get_content(attr_url, 0, 0, 0); - if (NULL == url_string) goto failed_to_release_xml; + if (NULL == url_string) + goto failed_to_release_xml; strncpy(s_info.url_upload, url_string, PEAR_SPEEDTEST_URL_LEN); strncpy(s_info.url_download, url_string, PEAR_SPEEDTEST_URL_LEN); free(url_string); @@ -163,58 +188,71 @@ int pear_speedtest_get_some_server(pear_speedtest_client_info_t *client_info, // lat // node_t *attr_lat = roxml_get_attr(server, "lat", 0); - if (NULL == attr_lat) goto failed_to_release_xml; + if (NULL == attr_lat) + goto failed_to_release_xml; char *lat_string = roxml_get_content(attr_lat, 0, 0, 0); - if (NULL == lat_string) goto failed_to_release_xml; + if (NULL == lat_string) + goto failed_to_release_xml; s_info.lat = atof(lat_string); free(lat_string); // lon // node_t *attr_lon = roxml_get_attr(server, "lon", 0); - if (NULL == attr_lon) goto failed_to_release_xml; + if (NULL == attr_lon) + goto failed_to_release_xml; char *lon_string = roxml_get_content(attr_lon, 0, 0, 0); - if (NULL == lon_string) goto failed_to_release_xml; + if (NULL == lon_string) + goto failed_to_release_xml; s_info.lon = atof(lon_string); free(lon_string); // calc distance - // + // s_info.dis = pear_speedtest_calc_distance(client_info->lat, client_info->lon, s_info.lat, s_info.lon); - + // store first server_num service nodes // int i; - for (i = 0; i < server_num; i++) { - if (!server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (!server_info[i].set_value_flag) + { server_info[i].set_value_flag = 1; PEAR_SPEEDTEST_COPY_SERVERINFO(server_info[i], s_info); + real_num++; goto next_one; } } // find max distance node from server_num nodes // - for (i = 0; i < server_num; i++) { - if (NULL == max_distance_server_info) { + for (i = 0; i < server_num; i++) + { + if (NULL == max_distance_server_info) + { max_distance_server_info = &server_info[i]; continue; } - if (max_distance_server_info->dis < server_info[i].dis) { max_distance_server_info = &server_info[i]; } + if (max_distance_server_info->dis < server_info[i].dis) + { + max_distance_server_info = &server_info[i]; + } } // knock out max one // - if (max_distance_server_info->dis > s_info.dis) { + if (max_distance_server_info->dis > s_info.dis) + { PEAR_SPEEDTEST_COPY_SERVERINFO((*server_info), s_info); } } -next_one: + next_one: server = roxml_get_next_sibling(server); } roxml_close(root); - return 0; + return real_num; failed_to_release_xml: roxml_close(root); @@ -224,42 +262,47 @@ failed_to_release_buffer: } + int __pear_speedtest_cn_get_meta_data(json_t *json_root) { json_t *json_meta; - if (!json_root) { + if (!json_root) + { return 10; } json_meta = json_object_get(json_root, "meta"); - if (json_is_object(json_meta)) { + if (json_is_object(json_meta)) + { json_t *json_last_page = json_object_get(json_meta, "last_page"); - if (json_is_integer(json_last_page)) { + if (json_is_integer(json_last_page)) + { int total_pages = json_integer_value(json_last_page); return total_pages; } - } + } - return 0; + return 0; } - int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, - pear_speedtest_client_info_t *client_info, - pear_speedtest_server_info_t *server_info, - int server_num, + pear_speedtest_client_info_t *client_info, + pear_speedtest_server_info_t *server_info, + int server_num, char *what_is_my_country) { json_t *json_data = json_object_get(json_root, "data"); - if (json_is_array(json_data)) { - int node = 0; - int array_size = json_array_size(json_data); + if (json_is_array(json_data)) + { + int node = 0; + int array_size = json_array_size(json_data); - for (node = 0; node < array_size; node++) { - pear_speedtest_server_info_t *max_distance_server_info = NULL; - pear_speedtest_server_info_t s_info; + for (node = 0; node < array_size; node++) + { + pear_speedtest_server_info_t *max_distance_server_info = NULL; + pear_speedtest_server_info_t s_info; json_t *json_node = json_array_get(json_data, node); json_t *json_country_code = json_object_get(json_node, "country_code"); @@ -270,7 +313,7 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, json_t *json_lon = json_object_get(json_node, "lon"); json_t *json_dis = json_object_get(json_node, "distance"); - // printf("[Pear] %10d , (%s, %s), %s --> %s | %s\n", + // printf("[Pear] %10d , (%s, %s), %s --> %s | %s\n", // node, // json_string_value(json_lat), // json_string_value(json_lon), @@ -280,25 +323,34 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, /* filter country */ - if (json_is_string(json_country_code)) { - strncpy(s_info.coutry_code, json_string_value(json_country_code), PEAR_SPEEDTEST_COUNTRY_CODE_LEN - 1); - } else { + if (json_is_string(json_country_code)) + { + strncpy(s_info.coutry_code, json_string_value(json_country_code), PEAR_SPEEDTEST_COUNTRY_CODE_LEN - 1); + } + else + { s_info.coutry_code[0] = 0; } - if (strcmp(s_info.coutry_code, client_info->country) != 0) { + if (strcmp(s_info.coutry_code, client_info->country) != 0) + { continue; } // printf("s_info.coutry_code: %s, client_info->country: %s\n", s_info.coutry_code, client_info->country); /* filter operator */ - if (json_is_string(json_operator)) { - strncpy(s_info.operator, json_string_value(json_operator), PEAR_SPEEDTEST_URL_LEN - 1); - } else { + if (json_is_string(json_operator)) + { + strncpy(s_info.operator, json_string_value(json_operator), PEAR_SPEEDTEST_URL_LEN - 1); + } + else + { s_info.operator[0] = 0; } - if (filter_operator) { - if (!strstr(s_info.operator, client_info->isp)) { + if (filter_operator) + { + if (!strstr(s_info.operator, client_info->isp)) + { continue; } } @@ -309,59 +361,80 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, // continue; // } - // upload url - // - if (json_is_string(json_upload)) { + // upload url + // + if (json_is_string(json_upload)) + { strncpy(s_info.url_upload, json_string_value(json_upload), PEAR_SPEEDTEST_URL_LEN - 1); - } else { - continue; + } + else + { + continue; } // download url // - if (json_is_string(json_download)) { + if (json_is_string(json_download)) + { strncpy(s_info.url_download, json_string_value(json_download), PEAR_SPEEDTEST_URL_LEN - 1); - } else { - continue; + } + else + { + continue; } // printf("s_info.url_upload: %s, s_info.url_download: %s\n", s_info.url_upload, s_info.url_download); - // lat + // lat // - if (json_is_string(json_lat)) { + if (json_is_string(json_lat)) + { char *lat = json_string_value(json_lat); - if (lat) { + if (lat) + { s_info.lat = atof(lat); } - } else if (json_is_real(json_lat)) { + } + else if (json_is_real(json_lat)) + { s_info.lat = json_real_value(json_lat); - } else { - continue; + } + else + { + continue; } // lon // - if (json_is_string(json_lon)) { + if (json_is_string(json_lon)) + { char *lon = json_string_value(json_lon); - if (lon) { + if (lon) + { s_info.lon = atof(lon); } - } else if (json_is_real(json_lon)) { + } + else if (json_is_real(json_lon)) + { s_info.lon = json_real_value(json_lon); - } else { - continue; + } + else + { + continue; } // calc distance // - if (json_is_integer(json_dis)) { + if (json_is_integer(json_dis)) + { s_info.dis = json_integer_value(json_dis); // printf("-->distance: %f\n", s_info.dis); - } else { - s_info.dis = pear_speedtest_calc_distance(client_info->lat, - client_info->lon, - s_info.lat, - s_info.lon); + } + else + { + s_info.dis = pear_speedtest_calc_distance(client_info->lat, + client_info->lon, + s_info.lat, + s_info.lon); } // printf("newest: s_info.url_upload: %s\n", s_info.url_upload); @@ -369,8 +442,10 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, // store first server_num service nodes // int i = 0; - for (i = 0; i < server_num; i++) { - if (server_info[i].set_value_flag != 1) { + for (i = 0; i < server_num; i++) + { + if (server_info[i].set_value_flag != 1) + { server_info[i].set_value_flag = 1; PEAR_SPEEDTEST_COPY_SERVERINFO_CN(server_info[i], s_info); // printf("insert: %d, s_info.url_upload: %s\n", i, s_info.url_upload); @@ -384,9 +459,11 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, // int ii = 0; // printf("distance: "); max_distance_server_info = &server_info[0]; - for (i = 1; i < server_num; i++) { + for (i = 1; i < server_num; i++) + { // printf("%f ", server_info[i].dis); - if (max_distance_server_info->dis < server_info[i].dis) { + if (max_distance_server_info->dis < server_info[i].dis) + { max_distance_server_info = &server_info[i]; // ii = i; } @@ -395,7 +472,8 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, // knock out max one // - if (max_distance_server_info->dis > s_info.dis) { + if (max_distance_server_info->dis > s_info.dis) + { PEAR_SPEEDTEST_COPY_SERVERINFO_CN((*max_distance_server_info), s_info); // printf("replace: s_info.url_upload: %s\n\n", s_info.url_upload); // printf("replace: %d, s_info.url_download: %s\n", ii, s_info.url_download); @@ -404,71 +482,79 @@ int __pear_speedtest_cn_get_server_data(json_t *json_root, int filter_operator, next_one: continue; } - } else { return -1; } + } + else + { + return -1; + } - return 0; + return 0; } - int pear_speedtest_cn_count(pear_speedtest_server_info_t *server_info, int server_num) { int i = 0; int count = 0; - for (i = 0; i < server_num; i++) { - if (server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (server_info[i].set_value_flag) + { count++; } } return count; } - int pear_speedtest_cn_get_some_server(pear_speedtest_client_info_t *client_info, pear_speedtest_server_info_t *server_info, int server_num, char *what_is_my_country) { int total_pages = 10; json_error_t error; json_t *json_head = NULL; json_t *json_next = NULL; - char *header[] = { pear_speedtest_header_info.user_agent, "Cache-Control: no-cache", NULL}; + char *header[] = {pear_speedtest_header_info.user_agent, "Cache-Control: no-cache", NULL}; - memset(server_info, 0, sizeof(pear_speedtest_server_info_t) * server_num); + memset(server_info, 0, sizeof(pear_speedtest_server_info_t) * server_num); /* get meta data */ - pear_download_file("GET", "https://forge.speedtest.cn/api/speedtest/nodes", header, NULL, 0, 15, 30, "/tmp/.pear_speedtest_servers_cn.php"); + pear_download_file("GET", "https://forge.speedtest.cn/api/speedtest/nodes", header, NULL, 0, 15, 30, "/tmp/.pear_speedtest_servers_cn.php"); - json_head = json_load_file("/tmp/.pear_speedtest_servers_cn.php", JSON_DECODE_ANY, &error); - if (json_head) { + json_head = json_load_file("/tmp/.pear_speedtest_servers_cn.php", JSON_DECODE_ANY, &error); + if (json_head) + { total_pages = __pear_speedtest_cn_get_meta_data(json_head); // __pear_speedtest_cn_get_server_data(json_head, 1, client_info, server_info, server_num, what_is_my_country); - } + } /* get server data */ int page; - for (page = 1; page <= 10 && page < total_pages; page++) { + for (page = 1; page <= 10 && page < total_pages; page++) + { char url[256]; snprintf(url, 256, "https://forge.speedtest.cn/api/speedtest/nodes?page=%d", page); pear_download_file("GET", url, header, NULL, 0, 15, 30, "/tmp/.pear_speedtest_servers_cn.php"); - json_next = json_load_file("/tmp/.pear_speedtest_servers_cn.php", JSON_DECODE_ANY, &error); - if (!json_next) { - continue; - } + json_next = json_load_file("/tmp/.pear_speedtest_servers_cn.php", JSON_DECODE_ANY, &error); + if (!json_next) + { + continue; + } __pear_speedtest_cn_get_server_data(json_next, 1, client_info, server_info, server_num, what_is_my_country); json_decref(json_next); } /* if nodes less than 10, add some nodes without checking operator */ - if (pear_speedtest_cn_count(server_info, server_num) < 10) { + if (pear_speedtest_cn_count(server_info, server_num) < 10) + { __pear_speedtest_cn_get_server_data(json_head, 0, client_info, server_info, server_num, what_is_my_country); } - if (json_head) { + if (json_head) + { json_decref(json_head); } return 0; } - diff --git a/libpear/libpear_speedtest/libpear_get_server.h b/libpear/libpear_speedtest/libpear_get_server.h index 7a2f892da7e79706daa4a84e6521983e25e50aaf..f22bbc8e5413614a84327477f0cf616f692e243e 100644 --- a/libpear/libpear_speedtest/libpear_get_server.h +++ b/libpear/libpear_speedtest/libpear_get_server.h @@ -28,7 +28,7 @@ typedef struct { int pear_speedtest_get_some_server(pear_speedtest_client_info_t *client_info, pear_speedtest_server_info_t *server_info, int server_num, - char *what_is_my_country, + char **what_is_my_country, int c_num, int debug); diff --git a/libpear/libpear_speedtest/libpear_upload_test.c b/libpear/libpear_speedtest/libpear_upload_test.c index bf8f9213e3e49aca9805fab752a2bb69f14d8134..8504e04fa2adb7268fb21464cfc301c670f54008 100644 --- a/libpear/libpear_speedtest/libpear_upload_test.c +++ b/libpear/libpear_speedtest/libpear_upload_test.c @@ -1,41 +1,43 @@ -#include -#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "libpear_get_header.h" #include "libpear_upload_test.h" +#include "libpear_get_client.h" - -// void pear_speedtest_upload_set_prevalue(pear_speedtest_upload_info_t *upload_info, int n, double prevalue) -// { -// int i; -// for (i = 0; i < n; ++i) { -// upload_info[i].speed_bytes_second = prevalue; -// } -// } - - -static void pear_speedtest_cn_uuid(char *uuid) +static void pear_speedtest_cn_uuid(char *uuid) { - char *e = "0123456789abcdef"; - int temp=0; - int index=0; - for (int i = 0; i < 36; i++) - { - temp=random() % 16; - uuid[i] = e[temp]; - } - uuid[14] = '4'; - uuid[8] = '-'; - uuid[13] ='-'; - uuid[18] ='-'; - uuid[23] = '-'; - index=((3 & uuid[19] ) | 8); - uuid[19] = e[index]; + char *e = "0123456789abcdef"; + int temp = 0; + int index = 0; + for (int i = 0; i < 36; i++) + { + temp = random() % 16; + uuid[i] = e[temp]; + } + uuid[14] = '4'; + uuid[8] = '-'; + uuid[13] = '-'; + uuid[18] = '-'; + uuid[23] = '-'; + index = ((3 & uuid[19]) | 8); + uuid[19] = e[index]; } - static size_t _read_callback(char *buffer, size_t size, size_t nitems, void *userdata) { int i; @@ -43,7 +45,8 @@ static size_t _read_callback(char *buffer, size_t size, size_t nitems, void *use int r = random(); size_t total_size = size * nitems; - for (i = 0; i < total_size; i += 4) { + for (i = 0; i < total_size; i += 4) + { value = (int *)(buffer + i); *value = r + i; } @@ -51,7 +54,6 @@ static size_t _read_callback(char *buffer, size_t size, size_t nitems, void *use return total_size; } - static void __post_one_url(void *para) { CURL *curl; @@ -66,13 +68,16 @@ static void __post_one_url(void *para) /* user options */ curl_headers = curl_slist_append(curl_headers, "Content-Type: application/octet-stream"); - if (pear_speedtest_header_info.user_agent) { + if (pear_speedtest_header_info.user_agent) + { curl_headers = curl_slist_append(curl_headers, pear_speedtest_header_info.user_agent); } - if (pear_speedtest_header_info.origin) { + if (pear_speedtest_header_info.origin) + { curl_headers = curl_slist_append(curl_headers, pear_speedtest_header_info.origin); } - if (pear_speedtest_header_info.referer) { + if (pear_speedtest_header_info.referer) + { curl_headers = curl_slist_append(curl_headers, pear_speedtest_header_info.referer); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_headers); @@ -84,42 +89,59 @@ static void __post_one_url(void *para) curl_easy_setopt(curl, CURLOPT_READFUNCTION, _read_callback); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); /* in threads, if set, not signal handle to deal with SIGPIPE */ + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); /* in threads, if set, not signal handle to deal with SIGPIPE */ /* perform */ res = curl_easy_perform(curl); - if(CURLE_OK == res || CURLE_OPERATION_TIMEDOUT == res) { + if (CURLE_OK == res || CURLE_OPERATION_TIMEDOUT == res) + { double val = 0.0; res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &val); - if(CURLE_OK == res && val > 0) { + if (CURLE_OK == res && val > 0) + { server_info->ups = val; // printf("val: %f\n", val); } } - + curl_easy_cleanup(curl); curl_slist_free_all(curl_headers); pthread_exit((void *)(server_info->ups)); } +static double getElapsedTime(struct timeval tval_start) +{ + struct timeval tval_end, tval_diff; + gettimeofday(&tval_end, NULL); + tval_diff.tv_sec = tval_end.tv_sec - tval_start.tv_sec; + tval_diff.tv_usec = tval_end.tv_usec - tval_start.tv_usec; + if (tval_diff.tv_usec < 0) + { + --tval_diff.tv_sec; + tval_diff.tv_usec += 1000000; + } + return (double)tval_diff.tv_sec + (double)tval_diff.tv_usec / 1000000; +} -void pear_speedtest_upload_test(pear_speedtest_upload_info_t *upload_info, +void pear_speedtest_upload_test(pear_speedtest_upload_info_t *upload_info, pear_speedtest_server_info_t *server_info, int server_num) { - #define SPEEDTEST_THREAD_NUM 20 +#define SPEEDTEST_THREAD_NUM 20 pthread_t tid[SPEEDTEST_THREAD_NUM]; // start thread to download // int i; - for (i = 0; i < server_num; i++) { + for (i = 0; i < server_num; i++) + { if (!server_info[i].set_value_flag) continue; printf("[speedtest] upload %s\n", server_info[i].url_upload); int ret = pthread_create(&tid[i], NULL, __post_one_url, (void *)(server_info + i)); - if(ret != 0) { + if (ret != 0) + { server_info[i].set_value_flag = 0; printf("Couldn't run thread number %d, errno %d\n", i, ret); } @@ -129,34 +151,39 @@ void pear_speedtest_upload_test(pear_speedtest_upload_info_t *upload_info, // upload_info->speed_bytes_second = 0; - for (i = 0; i < server_num; i++) { - if (!server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (!server_info[i].set_value_flag) + { continue; } int ret = pthread_join(tid[i], NULL); - if (ret == 0) { + if (ret == 0) + { printf("Upload Thread %d, upload: %ld bytes/sec\n", i, server_info[i].ups); } - if (server_info[i].ups > 0) { + if (server_info[i].ups > 0) + { upload_info->speed_bytes_second += server_info[i].ups; } } } - -void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, - pear_speedtest_server_info_t *server_info, - int server_num) +void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, + pear_speedtest_server_info_t *server_info, + int server_num) { - #define SPEEDTEST_THREAD_NUM 20 +#define SPEEDTEST_THREAD_NUM 20 pthread_t tid[SPEEDTEST_THREAD_NUM] = {0X00}; - char uuid[64] = {0X00}; + char uuid[64] = {0X00}; // start threads to upload // int i; - for (i = 0; i < server_num; i++) { - if (!server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (!server_info[i].set_value_flag) + { continue; } memset(uuid, 0X00, sizeof(uuid)); @@ -168,12 +195,15 @@ void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, printf("[speedtest.cn] upload %s %s\n", server_info[i].operator, server_info[i].url_upload); } - for (i = 0; i < server_num; i++) { - if (!server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (!server_info[i].set_value_flag) + { continue; } int ret = pthread_create(&tid[i], NULL, __post_one_url, (void *)(server_info + i)); - if(ret != 0) { + if (ret != 0) + { server_info[i].set_value_flag = 0; printf("Couldn't run thread number %d, errno %d\n", i, ret); } @@ -183,21 +213,24 @@ void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, // upload_info->speed_bytes_second = 0; - for (i = 0; i < server_num; i++) { - if (!server_info[i].set_value_flag) { + for (i = 0; i < server_num; i++) + { + if (!server_info[i].set_value_flag) + { continue; } int ret = pthread_join(tid[i], NULL); - if (ret == 0) { + if (ret == 0) + { printf("Upload Thread %d terminated: %ld bytes/sec\n", i, server_info[i].ups); } - if (server_info[i].ups > 0) { + if (server_info[i].ups > 0) + { upload_info->speed_bytes_second += server_info[i].ups; } } } - int pear_speedtest_upload_optimize(pear_speedtest_server_info_t *server_info, int server_num) { int i; @@ -210,34 +243,44 @@ int pear_speedtest_upload_optimize(pear_speedtest_server_info_t *server_info, in /* calc valid count */ - for (i = 0; i < server_num; i++) { - if(server_info[i].ups > 0) { + for (i = 0; i < server_num; i++) + { + if (server_info[i].ups > 0) + { map[i] = 1; valid_count++; tmp_valid_count++; - } else { + } + else + { map[i] = -1; } } /* check whether need to optimize */ - if ((valid_count > server_num) || (valid_count <= 0)) { + if ((valid_count > server_num) || (valid_count <= 0)) + { return -1; } /* set copy count */ unvalid_count = server_num - valid_count; - average_count = (unvalid_count > valid_count)? (unvalid_count / valid_count):1; - - for (i = 0; i < server_num && unvalid_count > 0; i++) { - if(map[i] > 0) { - if (tmp_valid_count > 0) { + average_count = (unvalid_count > valid_count) ? (unvalid_count / valid_count) : 1; + + for (i = 0; i < server_num && unvalid_count > 0; i++) + { + if (map[i] > 0) + { + if (tmp_valid_count > 0) + { map[i] = average_count; unvalid_count -= average_count; // printf("i = %d, value: %d\n", i, map[i]); - } else { + } + else + { map[i] = unvalid_count; unvalid_count = 0; // printf("i = %d, value: %d\n", i, map[i]); @@ -250,18 +293,25 @@ int pear_speedtest_upload_optimize(pear_speedtest_server_info_t *server_info, in /* */ - for (i = 0, j = 0; i < server_num && j < server_num;) { - if (map[j] < 0) { - if(map[i] > 0) { + for (i = 0, j = 0; i < server_num && j < server_num;) + { + if (map[j] < 0) + { + if (map[i] > 0) + { // printf("(i, j) --> (%d, %d)\n", i, j); // memcpy(server_info + j, server_info + i, sizeof(pear_speedtest_server_info_t)); memcpy(server_info[j].url_upload, server_info[i].url_upload, PEAR_SPEEDTEST_URL_LEN); map[i] -= 1; ++j; - } else { - ++i; } - } else { + else + { + ++i; + } + } + else + { ++j; } } @@ -269,3 +319,363 @@ int pear_speedtest_upload_optimize(pear_speedtest_server_info_t *server_info, in return 0; } +// ---url ------------------------------------------------------------------------- +typedef struct +{ + char *address; + int addressLen; + char *request; + int requestLen; + char *protocol; + int protocolLen; + int port; + int ssl; +} URLPARTS_T; + +/*Breaks apart a url into a port, address and request*/ +void breakUrl(const char *pUrl, URLPARTS_T *pUrlStruct) +{ + char url[2048]; + char *ptr2, *ptr1 = url; + strncpy(url, pUrl, sizeof(url)); + pUrlStruct->port = 80; + pUrlStruct->ssl = 0; + /*find protocol (like http:// or ftp://)*/ + ptr2 = strstr(ptr1, "://"); + if (ptr2 != 0) + { + *ptr2 = 0; + if (pUrlStruct->protocolLen > 0) + strncpy(pUrlStruct->protocol, ptr1, pUrlStruct->protocolLen); + + if (strcmp(ptr1, "ftp") == 0) + pUrlStruct->port = 21; + else if (strcmp(ptr1, "https") == 0) + { + pUrlStruct->port = 443; + pUrlStruct->ssl = 1; + } + ptr1 = ptr2 + 3; + } + else if (pUrlStruct->protocolLen > 0) + *pUrlStruct->protocol = 0; + + /*find request (the part starting at "/" after the address and port)*/ + ptr2 = strchr(ptr1, '/'); + if (ptr2 != 0) + { + if (pUrlStruct->requestLen > 0) + strncpy(pUrlStruct->request, ptr2, pUrlStruct->requestLen); + + *ptr2 = 0; + } + else if (pUrlStruct->requestLen > 1) + strncpy(pUrlStruct->request, "/", pUrlStruct->requestLen); + + /*find port (the part after ":")*/ + ptr2 = strchr(ptr1, ':'); + if (ptr2 != 0) + { + pUrlStruct->port = atoi(ptr2 + 1); + *ptr2 = 0; + } + + /*whats left should only be the address*/ + if (pUrlStruct->addressLen > 0) + strncpy(pUrlStruct->address, ptr1, pUrlStruct->addressLen); +} + +//------------------------------------http------------------------------------ +typedef int sock_t; +#define BAD_SOCKID 0 /* should use -1!! */ +int _httpErrorCode = 0; + +int httpLastError() +{ + return _httpErrorCode; +} + +sock_t httpPut(char *pAddress, int pPort, char *pRequest, unsigned long contentSize, int ssl) +{ + char buffer[0xFFFF]; + int sockId; + struct sockaddr_in addr; + struct hostent *hostEntry; + + if ((sockId = (int)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0) + return 0; + + if ((hostEntry = gethostbyname(pAddress)) == NULL) + return 0; + + addr.sin_family = AF_INET; + addr.sin_addr = *((struct in_addr *)*hostEntry->h_addr_list); + addr.sin_port = htons((unsigned short)pPort); + if (connect(sockId, (struct sockaddr *)&addr, + sizeof(struct sockaddr_in)) == -1) + return 0; + + /* TODO: Content-Length isn't set up, this is some kind of "hack". + I cannot understand, but some servers closes up connection too early + even if we set up Content-Lenght to 10 times more than we actually send. + Leaving it uninitialized gives us random high value.*/ + sprintf(buffer, "POST %s HTTP/1.1\r\n" + "Host: %s\r\n" + "User-Agent: SPEEDTEST_CLIENT\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Connection: keep-alive\r\n" + "Content-Length: %lu\r\n" + "\r\n", + pRequest, pAddress, 100 * contentSize); + + send(sockId, buffer, strlen(buffer), 0); + + return sockId; +} + +static int timefd_get() { + return timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC|TFD_NONBLOCK); +} + +static int timefd_set(int fd, int sec, long nsec){ + struct itimerspec new_value; + uint64_t exp; + memset(&new_value, 0, sizeof(struct itimerspec)); + new_value.it_value.tv_sec = sec; + new_value.it_value.tv_nsec = nsec; + return timerfd_settime(fd, 0, &new_value, NULL); +} + +// -1 error, 0 not expired, 1 expired +static int timefd_expired(int fd) { + uint64_t exp; + ssize_t s = read(fd, &exp, sizeof(uint64_t)); + if (s != sizeof(uint64_t)){ + if (errno == EAGAIN) { + return 0; + } + return -1; + } + return 1; +} + + +sock_t httpPutRequestSocket(const char *urlToUpload, unsigned long contentSize) +{ + char address[1024]; + char request[1024]; + URLPARTS_T url; + sock_t sockId; + + memset(&url, 0, sizeof(url)); + url.address = address; + url.request = request; + url.addressLen = sizeof(address); + url.requestLen = sizeof(request); + + breakUrl(urlToUpload, &url); + + sockId = httpPut(address, url.port, request, contentSize, url.ssl); + if (sockId != BAD_SOCKID) + return sockId; + fprintf(stderr, "Http error while creating PUT request socket: %i\n", + httpLastError()); + return BAD_SOCKID; +} + +//------------------------------config----------------- +#define R 6371 +#define PI 3.1415926536 +#define TO_RAD (PI / 180) + +#ifndef URL_PROTOCOL +#define URL_PROTOCOL "http" +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(_x) \ + (sizeof(_x) / sizeof(_x[0])) +#endif /* ARRAY_SIZE */ + + +const char *ConfigLineIdentitier[] = {"ip, speedTestConfig->isp); + for (int i = 1; i < server_cnt; i++) { + if (server_info[i].dis < server_info[selectedServer].dis) { + selectedServer = i; + } + } + strcpy(upload_url, server_info[selectedServer].url_upload); + strcpy(download_url, server_info[selectedServer].url_download); +} + +//---------------------------------uploadtest---------------------------------------- +static void __appendTimestamp(const char *url, char *buff, int buff_len) +{ + char delim = '?'; + char *p = strchr(url, '?'); + + if (p) + delim = '&'; + snprintf(buff, buff_len, "%s%cx=%llu", url, delim, (unsigned long long)time(NULL)); +} + +typedef struct thread_args +{ + pthread_t tid; + char *url; + unsigned int testCount; + unsigned long transferedBytes; + pthread_mutex_t lock; + + float elapsedSecs; +} THREADARGS_T; + +char buffer[BUFFER_SIZE] = {0}; + +static void *__uploadThread(void *arg) +{ + /* Testing upload... */ + unsigned long totalToBeTransfered = 1024 * 1024; + THREADARGS_T *threadConfig = (THREADARGS_T *)arg; + + int size; + struct timeval tval_start; + unsigned long remain = 0; + char uploadUrl[1024]; + threadConfig->transferedBytes = 0; + gettimeofday(&tval_start, NULL); + for (int i = 0; i < threadConfig->testCount; i++) + { + __appendTimestamp(threadConfig->url, uploadUrl, sizeof(uploadUrl)); + /* FIXME: totalToBeTransfered should be readonly while the upload thread is running */ + remain = totalToBeTransfered; + sock_t sockId = httpPutRequestSocket(uploadUrl, totalToBeTransfered); + if (sockId == 0) { + printf("Unable to open socket for Upload!"); + pthread_exit(NULL); + } + + int timefd = timefd_get(); + if (timefd < 0) { + printf("cannot create the timefd\n"); + pthread_exit(NULL); + } + int ret = timefd_set(timefd, TEST_TIMEOUT_SEC, 0); + if (ret < 0) { + printf("cannot set the timefd\n"); + pthread_exit(NULL); + } + ret = 0; + while (remain > 0 && ret == 0) + { + int send_size; + if (remain > BUFFER_SIZE) + { + send_size = BUFFER_SIZE; + } + else + { + send_size = remain; + buffer[remain - 1] = '\n'; /* Indicate terminated */ + } + size = send(sockId, buffer, send_size, 0); + if (size == -1) { + if (errno == EAGAIN || errno == EINTR) { + // re send + goto test_timeout; + } + printf("-------------------------send error------------------------\n"); + break; + } + remain -= size; + +test_timeout: + // test if timeout + ret = timefd_expired(timefd); + if (ret == 1) { + printf("-------------------------send timeout--------------------------\n"); + } else if (ret < 0) { + printf("error\n"); + } + } + close(timefd); + pthread_mutex_lock(&threadConfig->lock); + threadConfig->transferedBytes += totalToBeTransfered - remain; + pthread_mutex_unlock(&threadConfig->lock); + /* Cleanup */ + close(sockId); + if (ret == 1) { + break; + } + } + threadConfig->elapsedSecs = getElapsedTime(tval_start); + return NULL; +} + +float testUpload(pear_speedtest_client_info_t *speedTestConfig, const char *url) +{ + size_t numOfThreads = speedTestConfig->uploadThreadConfig.threadsCount; + THREADARGS_T *param = (THREADARGS_T *)calloc(numOfThreads, sizeof(THREADARGS_T)); + + /* Build the random buffer */ + for (int i = 0; i < BUFFER_SIZE; i++) + { + buffer[i] = 'a'; + } + + for (int i = 0; i < numOfThreads; i++) + { + memset(¶m[i], 0, sizeof(THREADARGS_T)); + pthread_mutex_init(¶m[i].lock, NULL); + /* Initializing some parameters */ + param[i].testCount = speedTestConfig->uploadThreadConfig.length; + if (param[i].testCount == 0) + { + /* At least three test should be run */ + param[i].testCount = 3; + } + param[i].url = malloc(strlen(url)+1); + strcpy(param[i].url, url); + if (param[i].url) + { + pthread_create(¶m[i].tid, NULL, &__uploadThread, ¶m[i]); + } + } + + /* Refresh */ + unsigned long totalTransfered = 0; + float speed = 0; + + /* Wait for all threads */ + for (int i = 0; i < numOfThreads; i++) + { + pthread_join(param[i].tid, NULL); + if (param[i].transferedBytes) + { + /* There's no reason that we transfered nothing except error occured */ + totalTransfered += param[i].transferedBytes; + speed += (param[i].transferedBytes / param[i].elapsedSecs) / 1024; + } + /* Cleanup */ + free(param[i].url); + pthread_mutex_destroy(¶m[i].lock); + } + free(param); + printf("Bytes %lu uploaded with a speed %.2f kB/s (%.2f Mbit/s)\n", + totalTransfered, speed, speed * 8 / 1024); + return speed * 1024; +} + + +void pear_speedtest_upload_test_v2(pear_speedtest_upload_info_t *upload_info, pear_speedtest_client_info_t *client_info, char* upload_url) +{ + float speed = testUpload(client_info, upload_url); + upload_info->speed_bytes_second = (double)speed; +} diff --git a/libpear/libpear_speedtest/libpear_upload_test.h b/libpear/libpear_speedtest/libpear_upload_test.h index e5f8d84ab3b9172a02225e20b12c5fdc1e4bd9bb..dcfb480b6d03ff68da2ddbb64da28dba93c76d71 100644 --- a/libpear/libpear_speedtest/libpear_upload_test.h +++ b/libpear/libpear_speedtest/libpear_upload_test.h @@ -3,6 +3,8 @@ #include "libpear_get_server.h" +#define TEST_TIMEOUT_SEC 10 +#define BUFFER_SIZE 1500 typedef struct { double speed_bytes_second; @@ -14,9 +16,11 @@ typedef struct { void pear_speedtest_upload_test(pear_speedtest_upload_info_t *upload_info, pear_speedtest_server_info_t *server_info, int server_num); +void pear_speedtest_upload_test_v2(pear_speedtest_upload_info_t *upload_info, pear_speedtest_client_info_t *client_info, char* upload_url); -void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, pear_speedtest_server_info_t *server_info, int server_num); +void getBestServer_v2(pear_speedtest_client_info_t *speedTestConfig, pear_speedtest_server_info_t *server_info, int server_cnt, char*download_url, char* upload_url); +void pear_speedtest_cn_upload_test(pear_speedtest_upload_info_t *upload_info, pear_speedtest_server_info_t *server_info, int server_num); int pear_speedtest_upload_optimize(pear_speedtest_server_info_t *server_info, int server_num); diff --git a/pear_build.sh b/pear_build.sh index 220176556f00d75460d40ae10211b77de58c7623..ab0b59c793c3a3cbc2359fb31e874d57eb0aa257 100755 --- a/pear_build.sh +++ b/pear_build.sh @@ -30,7 +30,7 @@ MONITOR_RELEASE_DIR="${PROJECTS_DIR}/Node-update/update-data" ## toggle to compile ## -PLATFORM_TOGGLE=(0 #PEAR_X64_UBUNTU +PLATFORM_TOGGLE=(1 #PEAR_X64_UBUNTU 0 #PEAR_X86_UBUNTU 0 #PEAR_1200_ARM_LINUX huawei router 0 #PEAR_1300_MT7621_OPENWRT gaoke router @@ -55,20 +55,20 @@ PLATFORM_TOGGLE=(0 #PEAR_X64_UBUNTU 0 #PEAR_1100_X64_OPENWRT nextwifi 0 #PEAR_1400_MIPS_OPENWRT youku router 0 #PEAR_1500_MT7621_PANDVAN panvan router - 1 #PEAR_1600_X64_UBUNTU jack mine ubuntu (must compile in 16.04 ubuntu, docker) + 0 #PEAR_1600_X64_UBUNTU jack mine ubuntu (must compile in 16.04 ubuntu, docker) 0 #PEAR_1700_MIPS_OPENWRT jcg router 0 #PEAR_1800_MIPS_OPENWRT renren_yingshi router - 1 #PEAR_1801_X64_LINUX renren_yingshi ubuntu (must compile in 16.04 ubuntu, docker) - 1 #PEAR_1900_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_1801_X64_LINUX renren_yingshi ubuntu (must compile in 16.04 ubuntu, docker) + 0 #PEAR_1900_X64_LINUX pear (must compile in 16.04 ubuntu, docker) 0 #PEAR_2000_MIPS_OPENWRT fog fan(fork from PEAR_1400_MIPS_OPENWRT) - 1 #PEAR_2100_X64_LINUX pear (must compile in 16.04 ubuntu, docker) - 1 #PEAR_2200_X64_LINUX pear (must compile in 16.04 ubuntu, docker) - 1 #PEAR_2300_X64_LINUX pear (must compile in 16.04 ubuntu, docker) - 1 #PEAR_2400_X64_LINUX pear (must compile in 16.04 ubuntu, docker) - 1 #PEAR_2500_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_2100_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_2200_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_2300_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_2400_X64_LINUX pear (must compile in 16.04 ubuntu, docker) + 0 #PEAR_2500_X64_LINUX pear (must compile in 16.04 ubuntu, docker) 0 #PEAR_3000_MIPS_OPENWRT qihu 360 0 #PEAR_1902_MIPS_OPENWRT newifi - 1 #PEAR_1905_X64_LINUX pear (must compile in 16.04 ubuntu, not docker) + 0 #PEAR_1905_X64_LINUX pear (must compile in 16.04 ubuntu, not docker) ) ## don't break order, just add to tail when have new platform diff --git a/pear_monitor/pear_speed.c b/pear_monitor/pear_speed.c index dec25e3ec3cb044bbf2dabdfcfd91676b6b03341..692ef89495f91138c7ef0cb13a2e004c39c9c8cb 100644 --- a/pear_monitor/pear_speed.c +++ b/pear_monitor/pear_speed.c @@ -40,7 +40,7 @@ void pear_speed_calc_refer_bw(void) static int __get_speed(pear_speedtest_upload_info_t *upload_info, pear_speedtest_download_info_t *download_info, int threads) { pear_speedtest_client_info_t client_info; - pear_speedtest_server_info_t server_info[threads]; + pear_speedtest_server_info_t server_info[10]; // select one user agent // @@ -66,14 +66,18 @@ static int __get_speed(pear_speedtest_upload_info_t *upload_info, pear_speedtest client_info.isp_n, client_info.isp, client_info.country); - + client_info.uploadThreadConfig.threadsCount = 2; + client_info.uploadThreadConfig.length = 10; // record some servers(according to min distance[lat, lon]) // - if (pear_speedtest_get_some_server(&client_info, server_info, threads, "China", pear_speed_info.speed_not_download) < 0) { + char *c[] = {"China", "Hong Kong"}; + int real_num = pear_speedtest_get_some_server(&client_info, server_info, 10, c, sizeof(c)/sizeof(c[0]), 0); + printf("the real server number is %d\n", real_num); + if (real_num < 0) { goto speedtest_failed; } int i; - for (i = 0; i < threads; i++) { + for (i = 0; i < real_num; i++) { if (server_info[i].set_value_flag) { printf("----> server(%d):\nurl: %s\nisp: %s\nlat: %f\nlon: %f\ndis: %f\n\n", i, @@ -84,17 +88,25 @@ static int __get_speed(pear_speedtest_upload_info_t *upload_info, pear_speedtest server_info[i].dis); } } - // upload test - // - pear_speedtest_upload_test(upload_info, server_info, threads); - printf("--> total upload: %f bytes/sec\n\n", upload_info->speed_bytes_second); + char upload_url[1024] = {0x00}; + double max_upload_speed = 0; + // getBestServer_v2(&client_info, server_info, real_num, download_url, upload_url); + for (int i = 0; i < real_num; i++) { + strcpy(upload_url, server_info[i].url_upload); + printf("the select upload url is:%s\n", upload_url); + pear_speedtest_upload_test_v2(upload_info, &client_info, upload_url); + printf("--> total upload: %f bytes/sec\n\n", upload_info->speed_bytes_second); + if (upload_info->speed_bytes_second > max_upload_speed) { + max_upload_speed = upload_info->speed_bytes_second; + } + } - // download test - // - pear_speedtest_download_test(download_info, server_info, threads); - printf("--> total download: %f bytes/sec\n\n", download_info->speed_bytes_second); + upload_info->speed_bytes_second = max_upload_speed; + printf("---------> total upload: %f bytes/sec\n\n", upload_info->speed_bytes_second); + pear_speedtest_download_test(download_info, server_info, real_num); + printf("---------> total download: %f bytes/sec\n\n", download_info->speed_bytes_second); // clear tmp files // pear_speed_info.speed_fail &= 0x2;