读取图像文件C++并将其放在套接字上

alk*_*lkz 2 c++ sockets image nspr

我正在尝试用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) );
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我将它写在套接字缓冲区中(使用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) );
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在网上找到的功能,我无法理解为什么这种功能完美而且我的工作不起作用Oo:

    while ( (ret = read(file_fd, buffer, BUFSIZE)) > 0 ) {
        (void)write(fd,buffer,ret);
Run Code Online (Sandbox Code Playgroud)

非常感谢你 :)

Dan*_*ani 5

你的问题在这里:

return ( std::string(buffer) );
Run Code Online (Sandbox Code Playgroud)

从a创建一个字符串char *将停止在前0字节,而图像可能包含很多.而不是返回一个字符串,返回一个vector<char>

return std::vector<char>(buffer, buffer + length);
Run Code Online (Sandbox Code Playgroud)