我正在尝试将哨声(“\ 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);
答案 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;