Forum: PC-Programmierung Übertragungsrate beim Senden messen (Netzwerk)


von Pascal O. (raven761)


Lesenswert?

Hallo,

ich hab einen Server mit select() und viele Clients die sich mit dem 
verbinden. Das Programm ist ein Testtool und soll die 
Netzwerkperformance analysieren.

Ich hatte beim select() Server bei jedem Schließen des Sockets der 
Gegenseite aufgezeichnet, wieviele Daten übergeben wurden und daraus mit 
einem Timer die Datenrate ausgerechnet. Nur dauert das alles zu lang und 
mein select() Server ist dann zu lahm um alle Clients zu bedienen und 
die Statistik zu führen.
(Es kommen dann Fehler, wie die Clients können nicht senden usw..)

Ich wollte das jetzt Senderseitig, also von jedem Client aus machen. Ich 
gehe genauso vor. Timer und genaue Angabe der übertragenen Daten.

Allerdings stimmen die Übertragungsraten manchmal nicht überein! Ich 
komm dann auf teilweise 170MB/s, obwohl höchstens 117MB/s möglich sind 
(Testweise mim Server rausgefunden).

Woran kann das liegen? Ist das vielleicht nicht die richtige Methode die 
Übertragungsrate vom Client aus zu berechnen??

Gruß und danke schonmal,

Pascal

von Peter (Gast)


Lesenswert?

Leider schreibst du nicht genau wie du es machst. Das Problem werden 
wohl die Puffer in Stack sein, auch hast du eine abweichung drin weil du 
bestimmt die die Nutzdaten rechtest aber über das netzt geht ja noch ein 
wenig overhead.

Wenn du es beim Client mache willst könnte ich es mir so vorstellen.

hole dir die Zeit, sende ein block von daten ( z.b. 10kb) in einer 
schleife, und rechte jeweil die menge auf eine Variable drauf. Nach 
jedem Senden kannst du anhand der Vergangenen Zeit und der Menge 
ermitteln wiviel du pro Zeit übertragen hast.

Aber Das Problem mit dem Server versteht ich noch nciht ganz, wenn der 
server "sauber" Programmiert ist darf es zu keinen fehler kommen auch 
sollte die Leistung der aktuellen computer bequem ausreichen um die 
Transferrate zu ermittln.

von Raven (Gast)


Lesenswert?

So wie du es sagst, mach ich es schon. Es sieht ungefähr so aus:

int data;
mytime = stopwatch();        // stopwatch() gibt die aktuelle zeit 
zurück

do{
  data = ::send(..);
  txdata += data;
}while("das datenpaket geschrieben ist")

mytime = stopwatch() - mytime;
int tmp = (txdata*100000) / mytime;   // Multiplikation weil die Zeit in 
µs ist



Aber du hast Recht mit dem Overhead, daran hab ich nicht gedacht. Das 
Problem mit dem Server ist nur, ich mach nicht nur die poplige 
Auswertung, sondern führe das auch gleichzeit für jeden Client aus der 
Daten sendet und es wird auch gleichzeitig geschaut, ob sein letzter 
Peak Maximum oder Minimum besser war. Das geschieht in einem anderen 
Klasse, die ich über einen Pointer anspreche.

Ich poste das morgen mal rein. Hab den Code grad nicht da. Das sind 
ungefähr 20 Zeilen die er beim Server in der letzten Schleife ausführt, 
wenn er merkt dass der Client seine Verbindung geschlossen hat.


rc = serverSocket3->recv(s);
if(rc == 0)
{
  // führe die ganzen Statistiken aus und lege sie in einen Vektor an
}

Ich dachte dass diese 20 Zeilen zuviel Zeit beanspruchen und er somit 
nicht schnell genug die Sockets pollen kann.

von Peter (Gast)


Lesenswert?

do{
  data = ::send(..);
  txdata += data;
}while("das datenpaket geschrieben ist")

wiviel sendest du da?
und warum wartest du im While noch einmal, send wartet schon bis die 
letzen daten im Puffer sind. Wenn die menge zu klein ist erhält man 
keine sinvollen daten.

von Pascal O. (raven761)


Lesenswert?

Das liegt daran, weil der Puffer zu klein ist für die teilweise 20MB 
großen Packete. Ich hab dann n char buffer mit einem pointer und schiebe 
den pointer immer weiter, bis alle daten draußen sind. ich hab den code 
grad nicht im kopf, deshalb hab ich das da oben hingeschrieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.