我正在尝试实现基本文件服务器。我一直在尝试使用这里找到的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文件?
答案 0 :(得分:3)
您无法将sendfile()
与FILE*
一起使用,您需要open()
,close()
和朋友提供的文件描述符。你不能只将一个FILE *转换成一个int并认为它会起作用。
也许您应该阅读sendfile()
联机帮助页以获取更多信息。
答案 1 :(得分:1)
没有特别的方法。您只需收到read()
或recv()
。
可能你的接收代码错了。