我正在使用C++开发一个程序,使用字符串容器,如std::string来存储来自套接字的网络数据(这是桃红色的),我一次最多接收1452字节帧中的数据,协议(protocol)使用 header ,包含有关数据包长度的数据区域部分的信息, header 是固定的20字节长度。我的问题是,字符串给了我一个未知的调试断言,如所述,它断言了,但是我没有得到有关该字符串的消息。现在考虑到我可以随时在一个帧中接收到多个数据包,我将所有接收到的数据放入字符串中,将reinterpret_cast放入我的数据结构中,计算数据包的总长度,然后将数据包的数据部分复制到一个用于正则表达式处理的字符串,这时我执行一个string.erase,如mybuff.Erase(totalPackLen);
我在这里错过了一些约定吗?还是在这里std::string确实是不合适的选择?泰

自行修复。用几个C调用滚动了我自己的非常简单的缓冲区:)

int ret = recv(socket,m_buff,0);
if(ret > 0)
{
    BigBuff.append(m_buff,ret);

    while(BigBuff.size() > 16){
        Header *hdr = reinterpret_cast<Header*>(&BigBuff[0]);
        if(ntohs(hdr->PackLen) <= BigBuff.size() - 20){
            hdr->PackLen = ntohs(hdr->PackLen);
            string lData;
            lData.append(BigBuff.begin() + 20,BigBuff.begin() + 20 + hdr->PackLen);
            Parse(lData); //regex parsing helper function
            BigBuff.erase(hdr->PackLen + 20); //assert here when len is packlen is 235 and string len is 1458;
        }
    }
}

最佳答案

您的评论没有意义:

    BigBuff.erase(hdr->PackLen + 20); //assert here when len is packlen is 235 and string len is 1458;
BigBuff.erase(hdr->PackLen + 20)将从hdr->PackLen + 20开始擦除,直到字符串结尾。从代码的描述-在我看来,您正在删除之外的内容数据的末尾。 Here's the reference for std::string::erase() 为您。

不用说std::string在这里完全不合适,应该是std::vector

关于c++ - 删除时断言的字符串问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6165683/

10-11 22:42
查看更多