2011-10-01 20 views
2

我想实现一个基本的文件服务器。我一直在尝试使用在这里找到的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调用中使用过?

+1

你能提供一些代码,你的sendfile调用和你的recv循环吗? –

+0

总是检查系统调用的返回值(fseek,sendfile,recv)。并将结果包含在您的问题中。 – Nemo

回答

2

你不能用FILE*使用sendfile(),你需要一个文件描述符由open()close()和朋友给出。你不能只把一个FILE *变成一个int并且认为它会起作用。

也许您应该阅读sendfile()联机帮助页以获取更多信息。

+0

谢谢,我只是不得不使用open而不是fopen。没有意识到差异。 – user974703

1

没有特别的方法。您只需收到read()recv()

可能是,您的接收代码错误。

+0

所以如果我要recv到一个字符串,一切都应该变成罚款? – user974703

+0

取决于你是如何做到的。不过,不要指望任何套接字读取代码一次读取整个文件。特别是如果它很大。 – jpalecek

+0

是的,我有一个循环。但即使我可以得到前几封信,知道它是正确的阅读。我很快就会看看它。 – user974703

相关问题