#1 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 Einfach den Internet Speed ermitteln Eine einfache und gute Möglichkeit den momentanen und maximalen Internet Speed zu ermitteln: Das hab ich nur gecoded zum testen, deswegen etwas unschön.... sollte auf allen Windows Versionen laufen... 12.06.2010 // 19 Uhr compiled: No File | xup.in Code: #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #pragma comment (lib, "iphlpapi.lib") #pragma comment (lib, "WS2_32.lib") void getInternetSpeed(); void getCurrentNetworkSpeed(); void fillArrayWithStartValues(); int downloadSomething(); BOOL getNumberInterface(); void calcInternetSpeed(); void getTable(); BOOL random(); MIB_IFTABLE* c_Table = NULL; DWORD size = 0; DWORD c_NumOfTables = 0; DWORD * dlspeed = 0; DWORD * ulspeed = 0; double maxdl = 0; double maxul = 0; double currentNetworkDL = 0; double currentNetworkUL = 0; int beenden = 0; const char * httpGet[] = {"GET /download/win2000platform/SP/SP3/NT5/EN-US/W2Ksp3.exe HTTP/1.0\r\nAccept: */*\r\nHost: download.microsoft.com\r\nUser-Agent: Mozilla/5.0/0.1\r\n\r\n","GET http://ftp.gwdg.de/pub/linux/slackware/slackware-current/extra/kde3-compat/qt3-3.3.8b-i486-opt1.txz\r\nHTTP/2.0\r\n\r\n","GET http://mirror.debianforum.de/debian-iso-archive/etch/i386/debian-40r8-i386-DVD-1.iso\r\nHTTP/2.0\r\n\r\n"}; const char * httpHost[] = {"download.microsoft.com", "ftp.gwdg.de","mirror.debianforum.de"}; int main(int argc, char *argv[]) { if (getNumberInterface()) { printf("Teste Download Speed....\n"); calcInternetSpeed(); } char c = getchar(); return 0; } void getInternetSpeed() { fillArrayWithStartValues(); for (int i = 0; i < 5; i++) { getTable(); for(DWORD i = 0; i < c_NumOfTables; i++) { if (c_Table->table[i].dwOperStatus == IF_OPER_STATUS_OPERATIONAL && c_Table->table[i].dwType == IF_TYPE_ETHERNET_CSMACD) { if ((dlspeed[i] < c_Table->table[i].dwInOctets || ulspeed[i] < c_Table->table[i].dwOutOctets)) { double download = (double)((c_Table->table[i].dwInOctets-dlspeed[i])/1024); double upload = (double)((c_Table->table[i].dwOutOctets-ulspeed[i])/1024); download -= currentNetworkDL; upload -= currentNetworkUL; //printf("\nDownload Speed: %4.2f Kbytes/sec\n",download); //printf(" Upload Speed: %4.2f Kbytes/sec\n\n",upload); if (maxdl < download) { maxdl = download; } if (maxul < upload) { maxul = upload; } } dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; } } Sleep(1000); } } void calcInternetSpeed() { double tempMaxDL = 0; double tempMaxUL = 0; WSADATA wsaData; if ( WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { printf("WSAStartup failed: %d\n"); return; } getCurrentNetworkSpeed(); for (int i = 0; i < 5; i++) { CreateThread(0,0,(LPTHREAD_START_ROUTINE)&downloadSomething,0,0,0); Sleep(20); } Sleep(1000); getInternetSpeed(); beenden = 1; tempMaxDL = maxdl; tempMaxUL = maxul; Sleep(2000); beenden = 0; getCurrentNetworkSpeed(); for (int i = 0; i < 5; i++) { CreateThread(0,0,(LPTHREAD_START_ROUTINE)&downloadSomething,0,0,0); Sleep(10); } Sleep(1000); getInternetSpeed(); beenden = 1; delete dlspeed; delete ulspeed; printf("\n\nMax Download Speed: %4.2f Kbytes/sec\n",((maxdl>tempMaxDL) ? maxdl : tempMaxDL)); } BOOL getNumberInterface() { if(GetNumberOfInterfaces(&c_NumOfTables) == NO_ERROR) { if(c_NumOfTables > 0) { size = sizeof(MIB_IFTABLE) + sizeof(MIB_IFROW) * c_NumOfTables; c_Table = (MIB_IFTABLE*)new char[size]; if (c_NumOfTables > 10) { c_NumOfTables = 10; } dlspeed = new DWORD[c_NumOfTables]; ulspeed = new DWORD[c_NumOfTables]; } else {printf("Error GetNumberOfInterfaces");return 0;} } else {printf("Error GetNumberOfInterfaces");return 0;} return 1; } void getCurrentNetworkSpeed() { fillArrayWithStartValues(); for (int i = 0; i < 3; i++) { getTable(); for(DWORD i = 0; i < c_NumOfTables; i++) { if (c_Table->table[i].dwOperStatus == IF_OPER_STATUS_OPERATIONAL && c_Table->table[i].dwType == IF_TYPE_ETHERNET_CSMACD) { //printf("%s\n",c_Table->table[i].bDescr); if ((dlspeed[i] < c_Table->table[i].dwInOctets || ulspeed[i] < c_Table->table[i].dwOutOctets)) { currentNetworkDL = (double)((c_Table->table[i].dwInOctets-dlspeed[i])/1024); currentNetworkUL = (double)((c_Table->table[i].dwOutOctets-ulspeed[i])/1024); } dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; } } Sleep(1000); } //printf("\nCurrent Network Speed: %u\n",currentNetworkDL); //printf("current ul: %u\n",currentNetworkUL); } void getTable() { DWORD ret = GetIfTable(c_Table, &size, false); if (ret != NO_ERROR) { printf("GetIfTable failed %u",ret); return; } } void fillArrayWithStartValues() { getTable(); for(UINT i = 0; i < c_NumOfTables; i++) { dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; } } int downloadSomething() { int iResult; SOCKADDR_IN addr; SOCKET s ,k; struct hostent *remoteHost; struct in_addr addr2; u_long iMode = 1; s = socket(AF_INET,SOCK_STREAM,0); k = s; if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten int randomHost = random(); remoteHost = gethostbyname(httpHost[randomHost]); addr2.s_addr = *(u_long *) remoteHost->h_addr_list[0]; //printf("%s\n",inet_ntoa(addr2)); printf("Server choose: %s\n",httpHost[randomHost]); addr.sin_family=AF_INET; addr.sin_port=htons(80); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr(inet_ntoa(addr2)); // zielrechner ist unser eigener iResult = connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(iResult == SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } Sleep(rand() % 100); iResult = send(s, httpGet[randomHost],strlen(httpGet[randomHost]),0); if (iResult < 10) { printf("Fehler: send gescheitert, fehler code: %d\n",WSAGetLastError()); } char * recvbuf = new char[50000]; do { iResult = recv(s, recvbuf, 50000, 0); if ( iResult > 0 ) { //printf("Bytes received: %d\n", iResult); } else if ( iResult == 0 ) printf("Connection closed\n"); else printf("recv failed: %d\n", WSAGetLastError()); Sleep(5); } while( iResult > 0 && !beenden ); closesocket(s); delete recvbuf; return TRUE; } BOOL random() { srand ( time(NULL) ); srand ( time(NULL) ); int s = (rand() % 100); if (s >= 70) return 2; else if (s < 30) return 1; else return 0; } + Multi-Zitat Zitieren
#2 11. Juni 2010 AW: Einfach den Internet Speed ermitteln du musst auch was downloaden mit z.B. firefox? ubuntu ist gut zum testen: Download Ubuntu Desktop | Ubuntu Automatisch downloaden geht noch nicht... Mit F1 kann man sich den max speed anzeigen lassen.... compiled: siehe oben + Multi-Zitat Zitieren
#4 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln Jaja, habe ich auch gemerkt, schreib das halt dazu. Habe mich schon gewundert, wie das funktionieren soll Hatte keine Lust den ganzen Code zu lesen, habs einfach compiled und ausgeführt. + Multi-Zitat Zitieren
#5 11. Juni 2010 AW: Einfach den Internet Speed ermitteln Das Tool ist eben nicht für DAUs gedacht Bei mir funktioniert es auch gut bis jetzt. Ich glaube aber, dass das mit der Schnittstelle nich unbedingt nötig ist um den max. Speed rauszufinden. greez + Multi-Zitat Zitieren
#6 11. Juni 2010 AW: Einfach den Internet Speed ermitteln Ich bin ja auch keiner. Aber das von N0S funktioniert besser als deins Ich frage mich nur ob es so auch evtl. Netzwerktraffic mit zeichnet und so eine Falschausgabe macht? Müsste man mal testen. + Multi-Zitat Zitieren
#7 11. Juni 2010 AW: Einfach den Internet Speed ermitteln ja das frag ich mich auch^^ kann das mal einer testen?? hier ist der auto speed test, funktioniert perfekt... Code: #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <stdio.h> #pragma comment (lib, "iphlpapi.lib") #pragma comment (lib, "WS2_32.lib") void GetSpeed(); void fillArrayWithStartValues(); int downloadSomething(); MIB_IFTABLE* c_Table = NULL; DWORD size = 0; DWORD c_NumOfTables = 0; int * dlspeed = 0; int * ulspeed = 0; double maxdl = 0; double maxul = 0; int beenden = 0; int main(int argc, char *argv[]) { if(GetNumberOfInterfaces(&c_NumOfTables) == NO_ERROR) { if(c_NumOfTables > 0) { size = sizeof(MIB_IFTABLE) + sizeof(MIB_IFROW) * c_NumOfTables; c_Table = (MIB_IFTABLE*)new char[size]; dlspeed = new int[c_NumOfTables]; ulspeed = new int[c_NumOfTables]; } else {return 0;} } else {return 0;} fillArrayWithStartValues(); //downloadSomething(); CreateThread(0,0,(LPTHREAD_START_ROUTINE)&downloadSomething,0,0,0); for(;;) { GetSpeed(); printf("##############################################\n"); Sleep(1000); if((GetAsyncKeyState(VK_F1)&1)==1) { beenden = 1; break; } } printf("\n\nMax Download Speed: %4.2f Kbytes/sec\n",maxdl); printf("Max Upload Speed: %4.2f Kbytes/sec\n\n",maxul); char c = getchar(); return 0; } void GetSpeed() { GetIfTable(c_Table, &size, false); for(DWORD i = 0; i < c_NumOfTables; i++) { if (c_Table->table[i].dwOperStatus == IF_OPER_STATUS_OPERATIONAL && c_Table->table[i].dwType == IF_TYPE_ETHERNET_CSMACD) { if ((dlspeed[i] < c_Table->table[i].dwInOctets || ulspeed[i] < c_Table->table[i].dwOutOctets)) {/* printf("____________________________________________\n"); printf("%s\n",(char*)c_Table->table[i].bDescr); printf("old: %u - ",dlspeed[i]); printf("new: %u",c_Table->table[i].dwInOctets); printf(" - diff: %u\n",c_Table->table[i].dwInOctets-dlspeed[i]); printf("old: %u - ",ulspeed[i]); printf("new: %u",c_Table->table[i].dwOutOctets); printf(" - diff: %u\n",c_Table->table[i].dwOutOctets-ulspeed[i]);*/ double download = (double)((c_Table->table[i].dwInOctets-dlspeed[i])/1024); double upload = (double)((c_Table->table[i].dwOutOctets-ulspeed[i])/1024); printf("\nDownload Speed: %4.2f Kbytes/sec\n",download); printf(" Upload Speed: %4.2f Kbytes/sec\n\n",upload); dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; if (maxdl < download) { maxdl = download; } if (maxul < upload) { maxul = upload; } } dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; } } } void fillArrayWithStartValues() { GetIfTable(c_Table, &size, false); for(UINT i = 0; i < c_NumOfTables; i++) { dlspeed[i] = c_Table->table[i].dwInOctets; ulspeed[i] = c_Table->table[i].dwOutOctets; } } int downloadSomething() { WSADATA wsaData; int iResult; SOCKADDR_IN addr; SOCKET s; struct hostent *remoteHost; struct in_addr addr2; long rc; const char * httpGet = "GET /download/win2000platform/SP/SP3/NT5/EN-US/W2Ksp3.exe HTTP/1.0\r\nAccept: */*\r\nHost: download.microsoft.com\r\nUser-Agent: uuu29a/0.1\r\n\r\n"; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } s = socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten remoteHost = gethostbyname("download.microsoft.com"); addr2.s_addr = *(u_long *) remoteHost->h_addr_list[0]; //printf("%s\n",inet_ntoa(addr2)); addr.sin_family=AF_INET; addr.sin_port=htons(80); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr(inet_ntoa(addr2)); // zielrechner ist unser eigener rc = connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } send(s, httpGet,strlen(httpGet),0); char * recvbuf = new char[2000]; do { iResult = recv(s, recvbuf, 2000, 0); if ( iResult > 0 ) { //printf("Bytes received: %d\n", iResult); } else if ( iResult == 0 ) printf("Connection closed\n"); else printf("recv failed: %d\n", WSAGetLastError()); } while( iResult > 0 && !beenden ); closesocket(s); } + Multi-Zitat Zitieren
#8 11. Juni 2010 AW: Einfach den Internet Speed ermitteln Habs getestet, ist so wie ich dachte. Er misst alles was durch die Karte geht. Wenn ich auf meinem Notebook 'nen FTP aufsetze und dann eine Datei hoch/runter lade beinflusst das den Speedtest genauso als ob ich im Internet irgendwas lade. Das wird sich wahrscheinlich nur sehr schwer bis gar nicht ändern lassen, wenn weiterhin diese Methode benutzt wird denke ich? + Multi-Zitat Zitieren
#9 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln hier bitte mal alle testen^^ No File | xup.in jetzt sollte der netzwerkspeed keine rolle mehr spielen... + Multi-Zitat Zitieren
#10 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln ... Irgendwie geht bei mir mehr rein&raus .... Und nein, ick lade nicht grade nebenbei oda ähnliches. Greetz edit: 10/100mbit @de 100mbit @us .... irgendwie ist der upspeed immer zu langsam. Zufall? Greetz² + Multi-Zitat Zitieren
#11 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln Downloadgeschwindigkeit ist weitestgehend korrekt. Der Upload jedoch um den Faktor 5 zu klein (bei mir). + Multi-Zitat Zitieren
#12 11. Juni 2010 AW: Einfach den Internet Speed ermitteln Der Uploadspeed wird nicht getestet. In der exe waren noch paar bugs... probier mal das: oben neu + Multi-Zitat Zitieren
#13 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln ... Läuft ! Thx & Greetz + Multi-Zitat Zitieren
#14 11. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln Ach Mist, MS hat mich nun wohl geblockt, weil ich zu oft den scheiss getestet habe^^ hab jetzt nur noch einen dl speed von 100 bei MS... Oben ist jetzt der aktuelle sourcecode und hier die compiled exe: 11.06.2010 // 20 Uhr compiled: No File | xup.in glaub da verändere ich nichts mehr... vielleicht noch random dl host, aber das wars dann.... + Multi-Zitat Zitieren
#15 11. Juni 2010 AW: Einfach den Internet Speed ermitteln bei mir läuft komplett garnichts, bleibt bei 0 kbps habe windows 7, firewall deaktiviert und läuft trotzdem nicht + Multi-Zitat Zitieren
#16 12. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln naja ist ja sehr komisch... hab noch ein paar error checks reingebaut, probier das mal: https://www.xup.in/dl,17922940/speedtest.exe/ hab auch win 7 64bit und da läufts^^ + Multi-Zitat Zitieren
#17 12. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln und da hängt es dann + Multi-Zitat Zitieren
#18 12. Juni 2010 AW: Einfach den Internet Speed ermitteln Bei mir kommt nur 6700 raus obwohl ich ne 50er Leitung hab, ... Also es funzt zwar, aber der Download ist sicherlich zu klein um eine genaue aussage treffen zu können .... Ich hab da vlltwas für dich : http://speedtest.netcologne.de/ Dort hab ich mit den 1gb Files immer getestet ... sollte vllt etwas leichter sein ;-) lg + Multi-Zitat Zitieren
#19 12. Juni 2010 AW: Einfach den Internet Speed ermitteln Hey ho! Schönes Teil. Ich post hier mal 'ne Variante die ich damals gemacht hatte (ohne UL), einfach damit man sich mal mehrere Varianten anschauen kann. Deine Idee mit den Netzwerkschnittstellen ist recht interessant. Code: /* Windows Only */ #include <winsock.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #pragma comment(lib, "ws2_32.lib") const char *host = "134.76.12.3"; // ftp.gwdg.de const short port = 80; int main( void ) { SOCKET fd; WSADATA wsa = {0}; struct sockaddr_in info = {0}; size_t bytes = 0, sec_bytes = 0, cur, best = 0, avg = 0, worst = 0; char *_read; time_t start=0, end, bef = 0; char _send[] = "GET http://ftp.gwdg.de/pub/linux/slackware/slackware-current/extra/kde3-compat/qt3-3.3.8b-i486-opt1.txz\r\nHTTP/2.0\r\n" "\r\n"; fd_set fd_con_read; int actions = 0, i; _read = malloc(524288*2); /* SETTING UP INFO */ info.sin_family = AF_INET; info.sin_port = htons(port); info.sin_addr.S_un.S_addr = inet_addr(host); /* CREATING SOCKET & CONNECT + SEND REQUEST */ WSAStartup(MAKEWORD(2,0), &wsa); fd = socket(AF_INET, SOCK_STREAM, 0); connect(fd, (struct sockaddr*)&info, sizeof(info)); send(fd, _send, sizeof(_send), 0); /* RECV DATA TO VERIFY CONNECTION SPEED */ if(!start) start = time(NULL); /* INIT SELECT */ FD_ZERO(&fd_con_read); // container leeren FD_SET(fd, &fd_con_read); // und mit dem socket füllen while(0 != (actions = select(fd+1, &fd_con_read, NULL, NULL, NULL)) ) { end = time(NULL)-start; for(i=0; i<actions; i++) { if( !FD_ISSET(fd, &fd_con_read) ) continue; if(0 != (cur = recv(fd, _read, 524288*2, 0))) { bytes += cur; } else break; /* GET SECONDS RECEIVED */ if( bef+1 == end ) { if( sec_bytes != 0 ) { best = (best<sec_bytes/1024?sec_bytes/1024:best); worst = (worst>sec_bytes/1024 || worst == 0?sec_bytes/1024:worst); } sec_bytes = 0; bef++; } else { sec_bytes += cur; } } if( end == 10 ) break; } /* CLOSING SOCKET */ closesocket(fd); WSACleanup(); free(_read); avg = (bytes/1024)/(short)end; printf("DL:\n\taverage: %u kb/s\n\tbest: %u kb/s\n\tworst: %u kb/s\n", avg, best, worst); getchar(); return 0; } + Multi-Zitat Zitieren
#20 12. Juni 2010 Zuletzt von einem Moderator bearbeitet: 15. April 2017 AW: Einfach den Internet Speed ermitteln Bei allen wo der falsche speed raus kommt, könnt ihr mal die bw.exe testen? Showthread Php 719205 / Download - RR:Suche Theoretisch sollte da dann auch das falsche raus kommen. + Multi-Zitat Zitieren
#21 12. Juni 2010 AW: Einfach den Internet Speed ermitteln Also bei mir stimmt der Download Speed nun mit 3180 kb/sec. Allerdingst checkt er nun keinen Upload Speed mehr + Multi-Zitat Zitieren
#22 12. Juni 2010 AW: Einfach den Internet Speed ermitteln Hmm also ich glaube der Grund für den zu niedrigen Download Speed ist wohl immer ein Server Problem... Das kann man wohl nur mit mehr Threads und/oder andere hosts lösen... @remaL Deins zeigt mir auch den falschen Speed an... also wohl auch ein Server Problem. Deins finde ich aber besser als meins... aber ich denke man kann nicht mehrere Threads laufen lassen, weil das wohl sehr schwer werden wird mit dem speed ausrechnen... Somit wäre die einzige Verbesserungsmöglichkeit den Test mit verschiedenen Server durchzuführen... + Multi-Zitat Zitieren
#23 12. Juni 2010 AW: Einfach den Internet Speed ermitteln GetInfo v0.2 - Query system info and test bandwitdh Copyright (C) 2003-2004 sickness. http://www.this.website.doesnt.exist System info: Machine: \\XXX-000 running @ 2766 Mhz has been up for: 4 day(s), 4 hour(s), 27 minute(s), Running bandwidth test.......... C:\ -> XXXXXXXX D:\ -> XXXXXXXX E:\ -> XXXXXXXX Max Input stream : 0KBps + Multi-Zitat Zitieren
#24 12. Juni 2010 AW: Einfach den Internet Speed ermitteln Das passier nur, wenn das Programm aus irgendwelchen Gründen den Host zum downloaden nicht erreichen kann. (Firewall, DNS-Probleme etc.) + Multi-Zitat Zitieren
#25 12. Juni 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Einfach den Internet Speed ermitteln Ich glaub eher das die bw.exe nicht richtig unter Vista und 7 funktioniert. Ich hab mal Random Host eingebaut, vielleicht wird es dadurch genauer: No File | xup.in Es stehen 3 zur Auswahl die zufällig gewählt werden... + Multi-Zitat Zitieren