std :: string.append ("\ r \ n \ r \ n") добавляет c62; 9; c62; 9;до конца строки? - PullRequest
3 голосов
/ 04 октября 2011

Я пытаюсь добавить сторожа ("\ r \ n \ r \ n") для ответа HTTP на std::string в C ++.Однако, когда я добавляю данные, я получаю целую кучу дополнительных вещей: ^[[?62;9;c^[[?62;9;c[, после чего завершается работа моих программ.Затем в командной строке записывается следующее: 62;9;c62;9;c62;9;c62;9;c62;9;c62;9;c.Кажется, что это происходит только с файлами .jpg / .gif. Я проверил и проверил один и тот же метод работы с текстовыми и HTML-файлами.

Контекст заключается в том, что я пытаюсь записать эту строку в сокет, используя string.c_str().Я проследил дополнительные символы до операции добавления, которую я выполняю после прочтения нужного файла.Я думаю, что это сбрасывает мою расчетную длину контента, вызывая сбой.Поэтому мне просто нужно знать, почему этот дополнительный материал заканчивается в моем string.c_str()?

РЕДАКТИРОВАТЬ: Вот мой код чтения файла.(Забыл вставить его) (BUFFER_LENGTH # определяется как 1024)

    int fd = open(filename.c_str(),O_RDONLY);
    int bytesRead = 0;
    char buffer[BUFFER_LENGTH];
    string content = "";
    while((bytesRead = read(fd, buffer, BUFFER_LENGTH)) !=0)
    {           
        if(bytesRead==-1)
        {
            if(errno == EINTR)
            {
                printf("\nERRONO");
                continue;
            }
            else
            {
                printf("\nclosing fd");
                close(fd);
            }
        }  
        content+= buffer;
    }
    close(fd);
    //Printing content.c_str() here gives right value
    content += "\r\n\r\n";
    //Printing content.c_str() here gives the gibberish, and crash when I write it to the socket.
    return content;

Вот как я пишу в сокет (fdToUse - сокет):

write(fdToUse, response->fullResponse.c_str(), response->fullResponse.length());
close(fdToUse);

Ответы [ 3 ]

6 голосов
/ 04 октября 2011
content+= buffer;

должно быть:

content.insert( content.size(), buffer, bytesRead );
6 голосов
/ 04 октября 2011

^[[?62;9;c - управляющая последовательность VT100, сообщающая о состоянии терминала (DA1).Скорее всего, двоичные данные в GIF / JPG, которые вы выводите на терминал, содержат последовательность, которая заставляет ваш локальный терминал неожиданно реагировать.задокументировано в http://www.xfree86.org/current/ctlseqs.html (поиск «первичный DA»), но детали здесь не имеют прямого отношения.Важно то, что ваш терминал генерирует какой-то вывод, когда он видит на входе определенную последовательность.

2 голосов
/ 04 октября 2011

Вы не очень хорошо управляете данными файла.Вы действительно не должны хранить двоичные данные в std :: string для начала.Было бы лучше заранее рассчитать размер файла, отправить заголовок Content-Length, затем прочитать содержимое файла в двоичный буфер и отправить буфер во время чтения файла.

Если необходимо использоватьstd :: string, тогда вы должны хотя бы использовать что-то вроде этого:

std::string content;

int fd = open(filename.c_str(), O_RDONLY | O_BINARY);
if (fd != -1)
{
    long filesize = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET);

    if (filesize > 0)
    {
        content.resize(filesize);

        int total = 0, bytesRead;
        while (total < filesize)
        {
            bytesRead = read(fd, &content[total], filesize-total);
            if (bytesRead == -1)
            {
                printf("\nERRNO");
                content.resize(0);
                break;
            }

            if (bytesRead == 0)
            {
                printf("\nUnexpected EOF");
                content.resize(0);
                break;
            }

            total += bytesRead;
        }
    }

    close(fd);
}

content += "\r\n\r\n";
return content; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...