Прочитайте файл образа C ++ и поместите его в сокет - PullRequest
2 голосов
/ 05 декабря 2011

Я пытаюсь разработать небольшой веб-сервер на C ++, но у меня возникает проблема, когда я пытаюсь прочитать файл изображения и записать его в буфер сокетов. Я нашел похожую функцию, написанную на 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);

Большое спасибо:)

1 Ответ

5 голосов
/ 05 декабря 2011

Ваша проблема здесь:

return ( std::string(buffer) );

Создание строки из char * остановится на первых 0 байтах, тогда как изображение может содержать много. вместо возврата строки верните vector<char> как

return std::vector<char>(buffer, buffer + length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...