读取二进制文件并打印其内容(Web服务器)

时间:2011-11-24 10:19:37

标签: c++ webserver binaryfiles

我正在使用网络服务器 我已经创建了一个发送文件和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;

2 个答案:

答案 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指向的内存,直到找到字符串终结符。

您必须分两部分发送文件:首先是标题,然后是文件数据。