2015-07-07 3 views
0

Я создаю программу обмена файлами P2P, и я могу передавать файлы между вычислениями, подключенными к моему Wi-Fi маршрутизатору. Однако, когда я запускаю его на своем компьютере с адресом localhost, часть отправителя моей программы успешно отправляет все данные программе-получателю, но мой получатель не получает все данные. Я запускаю эти два на отдельных портах на своей машине. Проблема не возникает, когда я запускаю отправителя и получателя на отдельных машинах.recv() потеря данных на localhost

Вот мой получить фрагмент кода

while ((len = recv(welcomeSocket, buffer, BUFSIZ, 0)) > 0 && remain_data > 0) 
    { 
      fwrite(buffer, sizeof(char), len, received_file); 
      remain_data -= len; 
      fprintf(stdout, "Receive %zd bytes and we hope :- %d bytes\n", len, remain_data); 

    } 

А вот мой отправить фрагмент кода

 while (((sent_bytes = sendfile(fds[i].fd, fd, offset, BUFSIZ)) > 0) && (remain_data > 0)) 
    { 
      fprintf(stdout, "Server sent %u bytes from file's data, offset is now : %jd \n", sent_bytes, (intmax_t)offset); 
      remain_data -= sent_bytes; 
      fprintf(stdout, "remaining data = %d\n", remain_data); 
    } 

Выход на части отправителем является

Server sent 8192 bytes from file's data, offset is now : 0 
remaining data = 30292 
Server sent 8192 bytes from file's data, offset is now : 0 
remaining data = 22100 
Server sent 8192 bytes from file's data, offset is now : 0 
remaining data = 13908 
Server sent 8192 bytes from file's data, offset is now : 0 
remaining data = 5716 
Server sent 5716 bytes from file's data, offset is now : 0 
remaining data = 0 

И выход на приемнике

Receive 256 bytes and we hope :- 38228 bytes 
Receive 8192 bytes and we hope :- 30036 bytes 
Receive 8192 bytes and we hope :- 21844 bytes 
Receive 8192 bytes and we hope :- 13652 bytes 
Receive 5716 bytes and we hope :- 7936 bytes 

Опять же, этого не происходит при запуске этих программ на разных машинах, а recv() получает все данные. Является ли путь связи на локальном хосте настолько быстрым, что recv() не способен обрабатывать данные и, следовательно, пропускает некоторые из них?

Спасибо

+0

Предположения: попробуйте закрыть 'fd' после' sendfile' завершена. Сохраняете ли вы гнездо в отправителе до тех пор, пока приемник не будет выполнен? Возможно, отправитель слишком быстро заканчивает сокет. – cdarke

+0

Не будет причиной, но разве вы не должны бить 'offset' в отправителе по количеству отправленных байтов? – TripeHound

+0

@cdarke, я пробовал оба метода, закрывая или не закрывая сокет после отправки. Если я закрою его, recv() закончит преждевременно после показанных сообщений. Если я оставлю сокет открытым в отправителе, recv() продолжит блокировку, ожидая большего количества данных. –

ответ

1

Предполагая, что remain_data фактический размер файла, то оба ваши петли неправильно. Они должны быть больше, как это:

while (remain_data > 0) 
{ 
    len = recv(welcomeSocket, buffer, min(remain_data, BUFSIZ), 0); 
    if (len <= 0) { 
     // error handling... 
     break; 
    } 
    fwrite(buffer, sizeof(char), len, received_file); 
    remain_data -= len; 
    fprintf(stdout, "Receive %zd bytes and we hope :- %d bytes\n", len, remain_data); 
} 

off_t offset = 0; 
while (remain_data > 0) 
{ 
    sent_bytes = sendfile(fds[i].fd, fd, &offset, min(remain_data, BUFSIZ)); 
    if (sent_bytes <= 0) { 
     // error handling... 
     break; 
    } 
    fprintf(stdout, "Server sent %u bytes from file's data, offset is now : %jd \n", sent_bytes, (intmax_t)offset); 
    remain_data -= sent_bytes; 
    fprintf(stdout, "remaining data = %d\n", remain_data); 
} 
+0

Спасибо, Реми, вы правильно указали мои ошибки, теперь работает как шарм :) –

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

  • Нет связанных вопросов^_^