Вопрос, с которым я борюсь, заключается в том, как определить в c++
то, что является сервером с самым быстрым соединением для клиента, сделать git
клон от или загрузить tarball
. Поэтому в основном я хочу выбрать из коллекции известных зеркал, из которых один будет использоваться для загрузки контента.Как правильно определить самый быстрый CDN, зеркало, сервер загрузки в C++
После кода я написал демонстрирует то, что я пытаюсь добиться более ясно, может быть, но я считаю, что это не то, что нужно использовать в производстве :).
Так позволяет сказать, что у меня есть два известных источника зеркала git-1.exmple.com
и git-2.example.com
и я хочу, чтобы загрузить tag-x.tar.gz
от одного, который клиент имеет лучшее подключение к.
CDN.h
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
using namespace std;
class CDN {
public:
long int dl_time;
string host;
string proto;
string path;
string dl_speed;
double kbs;
double mbs;
double sec;
long int ms;
CDN(string, string, string);
void get_download_speed();
bool operator < (const CDN&);
};
#endif
CDN.cpp
#include "CND.h"
CDN::CDN(string protocol, string hostname, string downloadpath)
{
proto = protocol;
host = hostname;
path = downloadpath;
dl_time = ms = sec = mbs = kbs = 0;
get_download_speed();
}
void CDN::get_download_speed()
{
struct timeval dl_started;
gettimeofday(&dl_started, NULL);
long int download_start = ((unsigned long long) dl_started.tv_sec * 1000000) + dl_started.tv_usec;
char buffer[256];
char cmd_output[32];
sprintf(buffer,"wget -O /dev/null --tries=1 --timeout=2 --no-dns-cache --no-cache %s://%s/%s 2>&1 | grep -o --color=never \"[0-9.]\\+ [KM]*B/s\"",proto.c_str(),host.c_str(),path.c_str());
fflush(stdout);
FILE *p = popen(buffer,"r");
fgets(cmd_output, sizeof(buffer), p);
cmd_output[strcspn(cmd_output, "\n")] = 0;
pclose(p);
dl_speed = string(cmd_output);
struct timeval download_ended;
gettimeofday(&download_ended, NULL);
long int download_end = ((unsigned long long)download_ended.tv_sec * 1000000) + download_ended.tv_usec;
size_t output_type_k = dl_speed.find("KB/s");
size_t output_type_m = dl_speed.find("MB/s");
if(output_type_k!=string::npos) {
string dl_bytes = dl_speed.substr(0,output_type_k-1);
double dl_mb = atof(dl_bytes.c_str())/1000;
kbs = atof(dl_bytes.c_str());
mbs = dl_mb;
} else if(output_type_m!=string::npos) {
string dl_bytes = dl_speed.substr(0,output_type_m-1);
double dl_kb = atof(dl_bytes.c_str()) * 1000;
kbs = dl_kb;
mbs = atof(dl_bytes.c_str());
} else {
cout << "Should catch the errors..." << endl;
}
ms = download_end-download_start;
sec = ((float)ms)/CLOCKS_PER_SEC;
}
bool CDN::operator < (const CDN& other)
{
if (dl_time < other.dl_time)
return true;
else
return false;
}
main.cpp
#include "CDN.h"
int main()
{
cout << "Checking CDN's" << endl;
char msg[128];
CDN cdn_1 = CDN("http","git-1.example.com","test.txt");
CDN cdn_2 = CDN("http","git-2.example.com","test.txt");
if(cdn_2 > cdn_1)
{
sprintf(msg,"Downloading tag-x.tar.gz from %s %s since it's faster than %s %s",
cdn_1.host.c_str(),cdn_1.dl_speed.c_str(),cdn_2.host.c_str(),cdn_2.dl_speed.c_str());
cout << msg << endl;
}
else
{
sprintf(msg,"Downloading tag-x.tar.gz from %s %s since it's faster than %s %s",
cdn_2.host.c_str(),cdn_2.dl_speed.c_str(),cdn_1.host.c_str(),cdn_1.dl_speed.c_str());
cout << msg << endl;
}
return 0;
}
Итак, каковы ваши мысли и как вы подходите к этому. Каковы альтернативы для замены этого wget
и достичь такой же чистой, как в C++
EDIT: Как правильно @molbdnilo
меры пинг задержки заостренные, но вы заинтересованы в пропускной способности.
И поэтому я редактировал код, демонстрирующий, чтобы отразить, что, однако вопрос остается тем же
'ping' измеряет задержку, но вы заинтересованы в пропускной способности (соединение 128 kb/s с пингом 5 мс, вероятно, хуже, чем 100 Мбит/с с 50-секундным пингом). Я не думаю, что есть надежный способ предсказать пропускную способность, кроме как загрузить что-то существенное. – molbdnilo
@molbdnilo вы совершенно правы. Меня интересует пропускная способность и код, который я поставил с помощью ping, был просто иллюстрацией того, что я пытаюсь сделать. Вот что этот вопрос означает, что «загружает что-то существенное» только решение. –
@Marko этот вопрос как написано [не в формате, подходящем для переполнения стека] (http://stackoverflow.com/help), пожалуйста, сушите вопрос до конкретной проблемы с кодом или проблемы. – Mgetz