你会如何收到用'sendfile'发送的文件?

时间:2011-10-01 17:35:19

标签: c string recv sendfile

我正在尝试实现基本文件服务器。我一直在尝试使用这里找到的sendfile命令:http://linux.die.net/man/2/sendfile我正在使用TCP。

我可以让它发送正常,但它发送二进制文件,我不确定这是不是挂起。

我正在尝试使用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 Call(来自客户端进程,比循环更基本,只需要一个字母)

//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调用中使用了上面使用的文件指针代码,我应该如何使用send文件?

2 个答案:

答案 0 :(得分:3)

您无法将sendfile()FILE*一起使用,您需要open()close()和朋友提供的文件描述符。你不能只将一个FILE *转换成一个int并认为它会起作用。

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

答案 1 :(得分:1)

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

可能你的接收代码错了。