我有一个用c ++编写的HTTP服务器。在某些时候,我想处理一个必须作为响应发送到客户端的html文件,并用其他标签替换一些预定义的标签。过程如下:
do {
size = read(page_fd, buffer, 1024);
/* processing buffer - replacing variables */
std::string tmp = std::string(buffer);
unsigned int start = 0, end;
do {
start = tmp.find("#{", start);
if (start != std::string::npos && start < tmp.length()) {
end = tmp.find("}", start + 1);
if (end != std::string::npos && end < tmp.length()) {
std::string tmp2 = tmp.substr(start + 2, end - start - 2);
tmp = tmp.replace(start, end - start + 1, params[tmp2.c_str()]);
start = end + 1;
}
}
} while (start != std::string::npos && start > end && start < tmp.length());
char buff[512];
memcpy(buff, tmp.c_str(), tmp.length());
std::cout << buff << "\n\n";
/* end of processing - writing to socket */
write(_conn_fd, buff, tmp.length());
} while (size > 0);
我想发送给客户的html页面就是这个:
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>It works!</h1>
<h2>#{custom}</h2>
<p>This page was served through a C++ HTTP server!</p>
</body>
</html>
在检查客户端收到的内容时,html代码始终不完整,如下所示:
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>It works!</h1>
<h2>replaced message</h2>
<p>This page was served through a C++ HTTP server!</p>
代码中的std::cout
行输出正确的html字符串。
为什么客户端没有收到完整的html,或者如果它完全接收到它,为什么不能从浏览器看到它?
答案 0 :(得分:0)
您的缓冲区大小只有512个字节,但是您通过我的计算发送tmp.length()* 5 = 1040。所以写入将从缓冲区的末尾读取,导致不好的事情发生。
另外你应该做一个strncpy而不是memcpy,因为strncpy会包含尾随的null,而你的memcpy将排除null并且只是保留缓冲区,这意味着它可能会放任何东西,导致你的输出是随机的。
答案 1 :(得分:0)
我解决了!这是在解析和替换之前设置的内容长度。解析后,字符串的长度发生了变化,但内容长度保持不变。傻傻的我!