Frage

Ich versuche, einige Datei über Sockets in C zu erhalten, aber der Server sendet mir 64-Byte-Pakete für eine Million Byte-Datei zum Beispiel, und ich bekomme etwa 999.902 Bytes auf der Zieldatei.

while ((n = read(sd, buffer_in, BUFSIZE ))) //  BUFSIZE = 64 
{
    if(n<0)
    {
       printf("Fail.\n");
       fclose(archivo);
       return -1;
    }

    if(fwrite(buffer_in, n, 1, f) !=1 ) 
    { 
       printf("fwrite error.\n");
       fclose(archivo);
       return -1;
    }

    bytes+=n;
}

printf("We received %d bytes",  bytes);

Wenn Sie über ein lokales TCP / IP-Socket verwendet es funktioniert, aber nicht in einer langsamen Verbindung. Ich sehe durch das Debuggen, dass ich eine Menge von 64-Byte-Stücken zu bekommen, und einen 30-Byte-Chunks in der Nähe von EOF. Ich weiß, dass Sie weniger Bytes auf Lese bekommen können (), da der Aufruf zurückgegeben, wenn alle Daten (> 1 Byte) zur Verfügung stehen. Aber dieser Zustand nicht durch die während fangen werden? Sollte zurück, wenn n == 0, dh keine Daten mehr (EOF).

Thx für Ihre Hilfe.

(EDIT)

Senden von Code wie folgt:

while (n=read(file_fd, buffer, BUFSIZE))
{
   write (sdaccept, buffer, n)
}

Ich weiß, dass beide read () und write () zurückkehren N

(EDIT II)

Getestet mit einer C-Quelle mit 10673 Bytes, erhält 10575 ohne Korruption, mit der Ausnahme, dass die Zieldatei verfügt nicht über die ersten 98 Bytes !!!

War es hilfreich?

Lösung

Der Sendecode versehen ignoriert die Tatsache, dass () (oder send ()) auf einem Socket schreiben ist nicht den ganzen Puffer zu schreiben verpflichtet.

write () / () senden kann entscheiden, ob sich zum Teil schreiben oder nicht schreiben, wenn das zugrunde liegende Subsystem mehr Daten verweigert (zum Beispiel erhalten kann das Netzwerk-Subsystem eine Warteschlange für die Daten zu senden und diese Warteschlange ist bereits voll). Das ist sehr wahrscheinlich auf eine langsame Verbindung.

Die Sendeseite sollte den Rückgabewert von write () überprüfen, um zu ermitteln, wie viele Daten tatsächlich geschrieben wurde, und entsprechend anpassen.

Schreiben irgendwie wie dies getan werden sollte:

int readAmount;
while( readAmount = read(file_fd, buffer, BUFSIZE) > 0 )
{
    int totalWritten = 0;
    do {
       int actualWritten;
       actualWritten = write (sdaccept, buffer + totalWritten, readAmount - totalWritten);
       if( actualWritten == - 1 ) {
           //some error occured - quit;
       }
       totalWritten += actualWritten;
    } while( totalWritten < readAmount );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top