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
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. –