我想实现一个基本的文件服务器。我一直在尝试使用在这里找到的sendfile命令:http://linux.die.net/man/2/sendfile我正在使用TCP。你会如何收到一个用'sendfile'发送的文件?
我可以让它发送很好,但它的发送二进制,我不知道如果这是挂断。
我试图用recv来接收文件,但它没有正确地通过。 是否有一种特殊的方式来接收一个二进制文件,并将其放入一个字符串?
编辑: 要求提供一些代码,那就是:
SENDFILE呼叫(从服务器进程)
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给errno 9 - 坏文件编号。我假设在我的第二个文件描述符中(我发送的文件)。我把它作为一个整型,因为sendfile抱怨它不是int。
我应该如何使用发送文件给定的文件指针代码,我在上面的sendfile调用中使用过?
你能提供一些代码,你的sendfile调用和你的recv循环吗? –
总是检查系统调用的返回值(fseek,sendfile,recv)。并将结果包含在您的问题中。 – Nemo