2017-02-17 4 views
0

Ich versuche über socket TCP mit send() und recv() zu senden. Zum Testen sende ich eine kleinere Textdatei mit 38 Byte. Ich erhalte die Datei dies mit:Recv() nicht EOF bekommen?

char * b = (char *)malloc(chunk + 2); 
while (size > 0) { 
    memset(b, 0, chunk); 
    if (chunk > size) { 
     chunk = size; 
    } 
    if (size == total_size) { 
     gettimeofday(&tvB, NULL); 
    } 
    bytes_read = recv(ptr->sock, b, chunk, MSG_WAITALL); 

    if (bytes_read < 0) { 
     printf("ERROR: READ\n\n"); 
     break; 
    } 
    if (bytes_read == 0) break; 

     int err = fwrite(b, sizeof(char), bytes_read, fp); 
     if (err <= 0) { 
      printf("ERROR: FWRITE\n\n"); 
      break; 
     } 
     size -= bytes_read; 
     printf("SIZE: %d bytes_read = %d CHUNK: %d\n\n", size, bytes_read, chunk); 
     printf("TotalSize - size %d\n\n", total_size - size); 
    } 
    fclose(fp); 
    gettimeofday(&tvA, NULL); 

Und meine Sendeseite:

char * c = (char *)malloc(transfer_size + 2); 
while (bytes_to_send > 0) { 
    if (transfer_size > bytes_to_send) { 
     transfer_size = bytes_to_send; 
    } 
    size_t t = fread(c, 1, transfer_size, fp); 
    if (bytes_to_send == total_size) { 
     gettimeofday(&tvB, NULL); 
    } 

    bytes_sent = send(n->sock, c, transfer_size, 1); 
    if (bytes_sent <=0) { 
     // error 
     printf("SENDING ERROR\n\n"); 
     break; 
    } 
    bytes_to_send -= bytes_sent; 

    pos = total_size - bytes_to_send; 
    printf("bytes_sent: %d bytes_to_send: %d\n\n", bytes_sent, bytes_to_send); 

    fseek(fp, pos, SEEK_SET); 
    memset(c, 0, transfer_size * sizeof(char)); 
} 

Mein Problem ist, dass recv ist

A.) Nicht immer das letzte Byte aller Dateien, die ich senden und

B.) Es empfängt nicht die ganze "Chunk" jedes Mal, obwohl senden sagt, dass es alles gesendet hat.

Nur für weitere Informationen, hier ist die Ausgabe von Ausführen einer Übertragung einer kleinen Datei.

Empfangsseite:

Size: 38, Filename: hi.txt 

SIZE: 1 bytes_read = 37 CHUNK: 38 

TotalSize - size 37 

senden Seite:

bytes_sent: 38 bytes_to_send: 0 

Successfully sent hi.txt to dest 
+0

Ich verstehe, dass, deshalb habe ich es in einer Schleife und dekrementieren die verbleibenden Bytes zu lesen von der Menge der Bytes von recv() gelesen jeder Schleife. –

Antwort

1

A ist, weil Sie nie die Buchse im Sender zu schließen.

B ist, weil es nicht spezifiziert ist, so zu arbeiten.

Sie sollten t Bytes senden, nicht transfer_size Bytes.