我正在尝试用C ++开发一个小型Web服务器,但是当我尝试读取一个图像文件并将其写入套接字缓冲区时,我遇到了问题。 我发现用C编写的类似函数完美无缺,我无法理解为什么我的方法不起作用,当我通过浏览器连接到服务器并打开图像文件时我得到了这个输出。
“图像”http://127.0.0.1:7777/myimage.jpg“无法显示,因为它包含错误。”
这是我的方法:
std::string
Client::getFileContent(const std::string& name)
{
std::ifstream f; f.open(name.c_str(), std::ios::binary);
if( !f.is_open() ) {
return (std::string(""));
} else {
f.seekg(0, std::ios::end);
unsigned int length = f.tellg();
f.seekg(0, std::ios::beg);
char* buffer = new char[length];
f.read(buffer, length);
f.close();
return ( std::string(buffer) );
}
}
然后我将它写在套接字缓冲区中(使用nspr套接字):
void
Socket::send(const std::string& s)
{
if(PR_Send(sock, s.c_str(), s.length(), 0, PR_INTERVAL_NO_WAIT) == -1) {
throw ( Exception::Exception(Exception::Exception::SOCKET_SEND) );
}
}
这是我在网上找到的功能,我无法理解为什么这种功能完美无缺,而且我的功能不起作用O.o:
while ( (ret = read(file_fd, buffer, BUFSIZE)) > 0 ) {
(void)write(fd,buffer,ret);
非常感谢:)
答案 0 :(得分:5)
你的问题在这里:
return ( std::string(buffer) );
从char *
创建字符串将在前0字节处停止,而图像可能包含很多字符。而不是返回一个字符串,返回vector<char>
之类的
return std::vector<char>(buffer, buffer + length);