写入TCP套接字不完整的c ++

时间:2013-04-04 08:41:32

标签: c++ html string sockets

我有一个用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,或者如果它完全接收到它,为什么不能从浏览器看到它?

2 个答案:

答案 0 :(得分:0)

您的缓冲区大小只有512个字节,但是您通过我的计算发送tmp.length()* 5 = 1040。所以写入将从缓冲区的末尾读取,导致不好的事情发生。

另外你应该做一个strncpy而不是memcpy,因为strncpy会包含尾随的null,而你的memcpy将排除null并且只是保留缓冲区,这意味着它可能会放任何东西,导致你的输出是随机的。

答案 1 :(得分:0)

我解决了!这是在解析和替换之前设置的内容长度。解析后,字符串的长度发生了变化,但内容长度保持不变。傻傻的我!