std :: string.append(“\ r \ n \ r \ n”)添加c62; 9; c62; 9;到字符串结束?

时间:2011-10-04 19:24:49

标签: c++ sockets

我正在尝试将哨声(“\ r \ n \ r \ n”)附加到C ++中的std::string的HTTP响应中。但是,当我追加数据时,我得到了一大堆额外的东西:^[[?62;9;c^[[?62;9;c[,然后我的程序终止。然后它将以下内容写入命令行:62;9;c62;9;c62;9;c62;9;c62;9;c62;9;c。这似乎只发生在 .jpg / .gif文件中,我已经测试并验证了使用text和html文件的相同方法。

上下文是我尝试使用string.c_str()将此字符串写入套接字。在读完所需的文件后,我已经追踪了额外的字符到我做的追加操作。我认为这会导致我的计算内容长度失效,导致崩溃。所以我只需要知道为什么这些额外的东西最终会出现在string.c_str()

编辑:这是我的文件阅读代码。 (忘了粘贴它)(BUFFER_LENGTH #defined为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 个答案:

答案 0 :(得分:6)

^[[?62;9;c是VT100控制序列,报告终端的状态(DA1)。您输出到终端的GIF / JPG中的二进制数据可能包含一个导致本地终端以意外方式响应的序列。

您看到结果的具体顺序记录在http://www.xfree86.org/current/ctlseqs.html(搜索“主要DA”),但详细信息与此无直接关系。重要的是,当您的终端在输入时看到某个序列时,它会产生一些输出。

答案 1 :(得分:6)

content+= buffer;

应该是:

content.insert( content.size(), buffer, bytesRead );

答案 2 :(得分:2)

您没有很好地管理文件数据。你真的不应该将二进制数据存储到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;