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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.