[英]Writing to TCP socket incomplete c++
我有一个用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,或者如果客户端没有收到完整的html,为什么从浏览器中看不到它呢?
您的缓冲区只有512字节大小,但是根据我的计算,您正在发送的tmp.length()* 5 = 1040。 因此写操作将读取缓冲区的末尾,从而导致不良情况发生。
另外,您应该执行strncpy而不是memcpy,因为strncpy将包含结尾的null,而您的memcpy将排除null并仅保留缓冲区,这意味着可能在其中放置任何内容,从而导致输出为随机。
我解决了! 它是在解析和替换之前设置的内容长度。 解析后,字符串的长度发生了变化,但内容长度保持不变。 傻我!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.