我正在使用网络服务器 我已经创建了一个发送文件和http标头的功能 访问http://127.0.0.1:8080页面时
问题是它没有正确地copyig文件..它最后扔了一些垃圾..(我试图传递一个二进制文件,这就是为什么我使用std :: ios :: binary) example.bin
My Example bin file
:)
已下载的文件:
My Example bin file
:)ýýýýÝÝÝÝÝÝÝhjß/ÝÝ
我的代码:
// download file http headers
message_ = "HTTP/1.0 200 OK\r\n"
"Cache-Control: public\r\n"
"Content-Description: File Transfer\r\n"
"Content-Disposition: attachment; filename=example.bin\r\n"
"Content-Type: application/zip\r\n"
"Content-Transfer-Encoding: binary\r\n\r\n";
std::filebuf *pbuf;
std::ifstream sourcestr;
long size;
char * buffer;
sourcestr.open("example.bin",std::ios::in | std::ios::binary);
pbuf=sourcestr.rdbuf();
size=pbuf->pubseekoff (0,std::ios::end,std::ios::in);
pbuf->pubseekpos (0,std::ios::in);
buffer=new char[size];
// get file data
pbuf->sgetn (buffer,size);
message_ += buffer;
答案 0 :(得分:1)
我认为问题是在{pbuf-> sgetn()'调用之后buffer
没有空终止。尝试:
// EDIT: this won't work for reason stated by @Joachim in his answer.
buffer = new char[size + 1];
pbuf->sgetn(buffer, size);
*(buffer + size) = 0;
message_ += buffer;
如果message_
是std::string
,则没有NULL终止的替代方案将是:
message_.append(buffer, size);
希望有所帮助。
答案 1 :(得分:0)
最大的问题是您将二进制缓冲区的内容附加到字符串。 C ++中的字符串由字符'\ 0'终止,这意味着如果二进制文件在中间包含该字符,则“字符串”将被终止。如果二进制文件不包含任何'\ 0'字符,则将其附加到字符串将附加内存,直到找到终结符,这就是您获得额外垃圾的原因。行message_ += buffer
只是意味着添加buffer
指向的内存,直到找到字符串终结符。
您必须分两部分发送文件:首先是标题,然后是文件数据。