Frage zu Winsock bzgl. Komprimierung
-
Hi Leute,
ich hab es geschafft mit dem Winsock eine einfache Netzwerkkommunikation zu erstellen, diese funktioniert auch einwandfrei, lediglich die Geschwindigkeit ist sehr niedrig für meine Zwecke, daher versuche ich gerade diese zu verbessern.
Das beste Mittel dürfte wohl sein, die Daten zu komprimieren, daher meine Frage macht es Sinn die Daten während des Programmablaufs zu "sammeln" und am "Ende" der Schleife gemeinsam mit send() abzuschicken, oder sollte ich das sammeln dem Winsock überlassen und einfach immer send() aufrufen, wenn Daten zu sammeln sind?
Gruß
Scarabol
-
macht es Sinn die Daten während des Programmablaufs zu "sammeln" und am "Ende" der Schleife gemeinsam mit send() abzuschicken
-
Du musst schon genauere profiling daten auf den tisch legen und die art wie du sie gemessen hast, bzw die art und weise wie du daten schickst, damit wir dir hier vorschlaege unterbreiten koennen woran es liegen koennte bzw was eine nuetzliche optimierung ist.
-
Meinst du jetzt die Winsock-Lib die es in Windows und Unix gibt?
Ich würde dir raten, so große Pakete wie möglich zu versenden. Bei jedem Paket hast du einen gewissen Mehrwaufwand (Overhead) bei der Übertragung. Z.B. durch den TCP Header oder durch die Verarbeitung durch einen Netzwerkknoten (z.B. einem Switch, der die Pakete auspackt, nachsieht wohin sie geschickt werden sollen und dann weitersendet). Theoretisch erreichst du eine bessere Performanz, wenn du also wenige große (statt viele kleine) Pakete versendest.
Allerdings ist das nur eine grobe Aussage. Die Daten werden ggf. von deinem Betriebssystem gepuffert oder vom Netzwerkprotokoll zerhackt und auf dem Zielrechner wieder zusammengesetzt. Es kann auch sein das ein Paket nicht richtig übertragen wird und deshalb nochmal versendet werden muss. Das alles beeinflusst die Übertragungsgeschwindigkeit negativ.
Naja mach dir da nicht so viele Gedanken drüber. Versuche dein Programm nicht zu lange "Daten sammeln zu lassen" und nicht zu viele sehr kleine Pakete zu versenden. Dann solltest du auch eine "normale" Geschwindigkeit erreichen.
-
jop, ich verwende die Winsock Lib und meine Daten packe ich erst in Char Arrays und versende diese dann mit send();
// Beispiel für Textnachricht sprintf(buf,"&tWillkommen auf dem Server&\0"); send(clients[i],buf,(int)strlen(buf),0); // Beispiel für Variabeln sprintf(netbuffer, "&m%d,%d,%d&\0", int_one, int_two, int_three); send(clients[i],netbuffer,(int)strlen(netbuffer),0);
Wie man sieht, benutze ich & um die Daten zu trennen, 't' bzw. 'm' identifiziert die Daten als Textnachricht bzw. Variabeln die zu xyz gehören, clients[i] speichert den Socket und so sende ich auch alle anderen Daten...
Ich denke das ich mir mit der Umwandlung in char vor allem bei einfachen Variablen etwas Zeit ersparen könnte (auf Client Seite wird die Variable mit sscanf() ausgelesen), aber der Einfachheit halber würde ich dieses "Feature" gerne behalten, oder kostet mich das etwa so extrem viel Performance?
Wenn ich mein Programm so überfliege fallen mir vor allem Daten auf die der Client nicht bei jedem Schleifendurchlauf benötigt oder gar nur ein einziges Mal haben will, ich denke hier kann ich noch mit einfachen Anfrage->Antwort Methoden arbeiten um diese Pakete zu reduzieren. Ansonsten bin ich natürlich für jeden Tipp dankbar...
Gruß
Scarabol