2017-02-17 3 views
0

Я пытаюсь отправить через сокет TCP, используя send() и recv(). Для тестирования я отправляю меньший текстовый файл, который составляет 38 байт. Я получаю файл с помощью этого:Recv() не получает EOF?

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); 

И моей отправляющей стороны:

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)); 
} 

Моей проблема заключается в том, что RECV является

A.) Не получаю последние байты всех файлов, которые я посылаю , и

B.) Он не получает весь «кусок» каждый раз, хотя отправка говорит, что он отправил все.

Для получения более подробной информации, здесь вы можете выполнить передачу небольшого файла.

Получая сторона:

Size: 38, Filename: hi.txt 

SIZE: 1 bytes_read = 37 CHUNK: 38 

TotalSize - size 37 

отправляющая сторона:

bytes_sent: 38 bytes_to_send: 0 

Successfully sent hi.txt to dest 
+0

Я так понимаю, поэтому я имею его в цикле и уменьшая оставшиеся байты, чтобы читать количество байтов, считанных recv() каждым циклом. –

ответ

1

А потому, что вы никогда не закрывает сокет в отправителе.

B - это потому, что это не указано, чтобы работать таким образом.

Вы должны отправить t байт, а не transfer_size байт.

Смежные вопросы