Как бы вы получили файл, отправленный с «sendfile»? - PullRequest
2 голосов
/ 01 октября 2011

Я пытаюсь реализовать базовый файловый сервер. Я пытался использовать команду sendfile, найденную здесь: http://linux.die.net/man/2/sendfile Я использую TCP.

Я могу отправить его нормально, но в двоичном формате, и я не уверен, что это зависает.

Я пытаюсь получить файл с помощью recv, но он не проходит правильно. Есть ли специальный способ получить двоичный файл и поместить его в строку?

EDIT: Попросили предоставить код, вот он:

SENDFILE Call (из процесса сервера)

FILE * file = fopen(filename,"rb");
    if ( file != NULL)   
    {            
        /*FILE EXISITS*/ 
        //Get file size (which is why we opened in binary)
        fseek(file, 0L, SEEK_END);
        int sz = ftell(file);
        fseek(file,0L,SEEK_SET);

        //Send the file
        sendfile(fd,(int)file,0,sz);
        //Cleanup 
        fclose(file);
    }

ПОЛУЧИТЬ вызов (из процесса клиента, даже более простого, чем цикл, просто нужно одну букву)

//recieve file
    char fileBuffer[1000];
    recv(sockfd,fileBuffer,1,0);
    fprintf(stderr,"\nContents:\n");
    fprintf(stderr,"%c",fileBuffer[0]);

РЕДАКТИРОВАТЬ: написал код для проверки возвращаемых значений. sendfile дает ошибку 9 - неверный номер файла. Который я предполагаю, находится у моего второго файлового дескриптора в вызове (тот для файла, который я посылаю). Я использовал его как int, потому что sendfile жаловался, что это не int.

Как использовать файл отправки, учитывая код указателя файла, который я использовал выше при вызове файла sendfile?

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Вы не можете использовать sendfile() с FILE*, вам нужен дескриптор файла, заданный open(), close() и друзьями. Вы не можете просто привести ФАЙЛ * в int и думать, что это сработает.

Возможно, вам следует прочитать справочную страницу sendfile() для получения дополнительной информации.

1 голос
/ 01 октября 2011

Особого пути нет. Вы просто получаете с read() или recv().

Возможно, вы неправильно получили код приема.

...