繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM