Я создаю программу обмена файлами 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() не способен обрабатывать данные и, следовательно, пропускает некоторые из них?
Спасибо
Предположения: попробуйте закрыть 'fd' после' sendfile' завершена. Сохраняете ли вы гнездо в отправителе до тех пор, пока приемник не будет выполнен? Возможно, отправитель слишком быстро заканчивает сокет. – cdarke
Не будет причиной, но разве вы не должны бить 'offset' в отправителе по количеству отправленных байтов? – TripeHound
@cdarke, я пробовал оба метода, закрывая или не закрывая сокет после отправки. Если я закрою его, recv() закончит преждевременно после показанных сообщений. Если я оставлю сокет открытым в отправителе, recv() продолжит блокировку, ожидая большего количества данных. –