Senden von großen Datenmengen via C-Sockets



  • Hey Leute,
    wenn ich eine große Menge an Daten verschicke, sagen wir mehrere
    GB über TCP-Sockets, sollte ich das versenden jeweis immer in kleine Datenpackete verschicken also in etwa so
    (Hier sind die Pakete 8192 Byte groß)

    //len beinhaltet die Größe des Buffers der gesendet werden soll
    
    restsize = len;
    SendedBytes = 0;
    
    while (restsize > 0) {
    
    	 if (restsize < MSG_SIZE) 	//MSG_SIZE ist 8192
    		 blksize = restsize;
    
             if ((i = send(sock, bytes + SendedBytes, blksize, 0)) < 0)
     		return false;
    
      	SendedBytes = SendedBytes + i;
    	restsize -= i;
    }
    

    oder sollte ich versuchen direkt soviel wie möglich zu senden und dann nur den Rest verschicken der noch nicht ankam also etwa so :

    while (restsize > 0) {
    
    	if ((i = send(sock, bytes + SendedBytes, len - SendedBytes, 0)) < 0)
    		return false;
    
    	SendedBytes = SendedBytes + i;
    	restsize -= i;
    }
    

    Welche der beiden Codeabschnitte ist effizienter bzw. besser ?

    Vielen Dank für eure Hilfe



  • Und wie groß sollte optimalerweiße der Buffer sein zum Empfangen von Daten ?



  • Und was hat das mit C zu tun?



  • @Wutz
    Wie dumm bist du eigentlich ? Kannst du überhaupt C ?, kennst du die Schlüsselwörter? gug mal oben im Quellcode ? Wenn man zur Frage keine Antwort hat einfach die Klappe halten.



  • Raiden12312 schrieb:

    @Wutz
    Wie dumm bist du eigentlich ? Kannst du überhaupt C ?, kennst du die Schlüsselwörter? gug mal oben im Quellcode ? Wenn man zur Frage keine Antwort hat einfach die Klappe halten.

    Was er meint ist folgendes: Dein Problem hat nichts mit der Sprache C zu tun. Dein Problem ist der effiziente Umgang mit einer API.



  • Du bist derjenige, der hier in diesem Subforum die Klappe halten soll.
    "gug" mal in die Überschrift dieses Subforums, da steht was für Leute wie dich, die nicht "guggen" können: "Fragen zur Seriellen-Schnittstelle oder ähnliches haben nichts mit C zu tun. Bitte dies in den entsprechenden Foren (Linux, WinAPI, Rund Um Die Programmierung) posten."
    Und, ja, ich habe Ahnung von C, und sowohl hier im Forum als auch anderswo mehr C Code gesehen und geschrieben, als du in deinem Leben jemals verarbeiten wirst.
    Also halte die Klappe und "gugge" mal in die Forumsregeln bevor du hier rumtönst.



  • m( Ja ganz toll.
    @Raiden12312: Wutz hat nicht die größte Sozialkompetenz, weiß aber oft genug, worüber er schreibt. Hier hat er nicht mal diesen Mangel durchblicken lassen.

    Also: wenn wir über Socketkommunikation reden, dann sollte der Buffer mindestens ordentlich sein. 8 KB ist nicht schlecht, aber ist auch nicht gut, vor allem dann, wenn man fetten RAM hat. Aber das ist eher eine Frage des Betriebssystems oder der API - in C gibt es oft/meistens/eigentlich immer ein API, mit dem auf diese Funktionen zugegriffen werden können. Daher falsches Subforum.

    Die Antwort ist übrigens: du willst den Buffer schon größer haben. Ich rechne immer so mit 4 MiB Buffer (wobei ich aber auch meistens HTTP-Kommunikation mache). Überleg mal: Bei jedem send/recv hast du z.B. Kernel-Calls. Das heißt bei send , dass der Userspace-Wrapper erst mal einen Kontextwechsel machen muss - sprich, dein Programm gibt die Kontrolle an den Kernel ab, der kopiert erst mal den Speicherbereich, den du zum Senden freigibst, in seinen eigenen Kernel-Speicher, und sichert nebenbei noch den Programmstatus ab, damit nach dem Call wieder angefangen werden kann. Alles andere außen vor gelassen, aber das ist die Mindestlatenz, die du so hast. I/O-Bulk, Treiberkommunikation, DMA außen vor gelassen, weil du das kaum (OK, stimmt nicht ganz, aber schwer) im Userspace fixen kannst.

    Wenn du jetzt von einer 4 GiB-Datei immer 8 KiB am Stück versendest, sind das so ungefähr 5 Millionen Kernel-Calls. Wenn du 4 MiB verwendest, sind das nur noch 1024 Kernel-Calls.
    Der Kernel kümmert sich übrigens darum, dass die Daten bei dir auch ankommen. Zumindest, wenn du TCP verwendest. Das ist die Aufgabe von TCP.

    EDIT: Vollkommen kaputter Satz.



  • Raiden12312 schrieb:

    @Wutz
    Wie dumm bist du eigentlich ? Kannst du überhaupt C ?, kennst du die Schlüsselwörter? gug mal oben im Quellcode ? Wenn man zur Frage keine Antwort hat einfach die Klappe halten.

    Wutz' Kenntnisse in C sind besser als Deine Kenntnisse in C, Englisch und Lesen zusammen.

    Glaub's einfach.

    Mfg Martin


Anmelden zum Antworten