3

我正在尝试实现一个基本的文件服务器。我一直在尝试使用此处找到的 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 调用(来自客户端进程,比循环更基本,只需要一个字母)

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

编辑:写了一些代码来检查返回值。sendfile 给出 errno 9 - 错误文件号。我假设这是我在调用中的第二个文件描述符(我正在发送的文件的那个)。我将其转换为 int 是因为 sendfile 抱怨它不是 int。

鉴于我在上面的 sendfile 调用中使用的文件指针代码,我应该如何使用发送文件?

4

2 回答 2

3

您不能sendfile()与 a 一起使用,您需要由,和朋友FILE*给出的文件描述符。您不能只是将 FILE* 转换为 int 并认为它会起作用。open()close()

也许您应该阅读sendfile()手册页以获取更多信息。

于 2011-10-01T19:50:29.150 回答
1

没有什么特别的方法。您只需使用read()or接收recv()

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

于 2011-10-01T17:55:06.273 回答