Я пытаюсь реализовать распределенную систему обмена файлами p2p, где одноранговое соединение может отправлять и загружать файлы у других одноранговых узлов. Но у меня возникают проблемы с загрузкой и сохранением файла в каталог.C: Отправка и получение файла по сокету
Вот где я посылаю требуемый файл
while(!feof(requestedfile)) {
bytes_read = fread(buf, 1, sizeof(buf), requestedfile);
send(clientSock, buf, bytes_read, 0);
}
Когда я пытаюсь скачать, я следующий
while(recv(clientSock, currentLinePointer, 1, 0) != 0) {
currentLinePointer++;
}
Я новичок в C, но я знаю, что у меня есть 2 вопроса
- Как выполнить более эффективное чтение? Если я читаю 1024 байта за раз, на последнем блоке данных может быть только половина из 1024 байтов. Будут ли другие 512 бессмысленных байт вызывать ошибки в моем файле? (Я знаю, что плохие вещи случаются с картинками, когда вы пытаетесь прочитать и сохранить jpg с бессмысленными байтами в конце)
- Теперь, когда я прочитал файл, как мне сохранить этот файл? Скажите запрос сверстника «hello.jpg». Установка у меня может отправлять и читать файл, но теперь, как я могу сохранить этот файл в каталог, запрашивающего сверстники «PATH/Фотографии /»
Помните, что 'recv' возвращает количество фактически полученных байтов, -1 при ошибке и 0 при закрытом соединении. Это может помочь сделать блокировку неблокирующей. –
Что касается сохранения в «правильной» папке, либо изменить протокол, чтобы программа отправки сначала отправила путь, либо установила его в принимающей программе. –
Было бы более эффективно использовать sendfile (2) на обоих концах (http://linux.die.net/man/2/sendfile) –