【问题标题】:Locating STX and ETX in a String in C++ [closed]在 C++ 中的字符串中定位 STX 和 ETX [关闭]
【发布时间】:2012-10-14 08:29:18
【问题描述】:

有没有办法在 c++ 中的 recv() 接收到的消息中检测 STX(文本开始)和 ETX(文本结束)字符序列?我正在尝试修复 TCP 中可能发生的任何部分读取,以便我可以修改完整的消息。

谢谢!

编辑1:

根据 unwind 的答案做了以下操作:

char c = '\x02';
if(memchr((*it).c_str(), c, numberOfCharactersRead) != NULL) 
    cout << "STX found" << endl;

我还是没能检测到这个角色。这个实现有什么问题吗? 'it' 是字符串类型向量的迭代器。

EDIT2:

这是接收数据和检查字符的完整代码:

int numberOfCharactersRead = 0;

    do {
        char msgBuffer[1000];
        memset(msgBuffer, 0, 1000);
        numberOfCharactersRead = recv(clientSideSocket, msgBuffer, (1000 - 1), 0);
        if (numberOfCharactersRead < 0) {
            close(clientSideSocket);
        }
        else if (numberOfCharactersRead == 0)
            close(clientSideSocket);
        else {
            char c = '\x02';
            if(memchr(msgBuffer, c, numberOfCharactersRead) != NULL) 
                cout << "STX found" << endl;
            memset(msgBuffer, 0, 1000);
        }

    } while (numberOfCharactersRead > 0); 

所以,我只是检查 STX,尚未连接缓冲数据。但是,STX 检查仍然失败。请让我知道这种方法中的任何问题。

谢谢。

EDIT3:

我得到以下示例消息的十六进制值:

3C 31 34 32 3E 4F 63 74 20 32 35 20 31 31 3A 33 39 3A 31 32 20 6C 6F 63 61 6C 68 6F 73 74 20 5B 20 32 30 31 32 2D 4F 63 74 2D 32 35 20 31 31 3A 33 39 3A 31 32 2C 36 31 33 20 5D 20 20 20 20 49 4E 46 4F 20 7B 20 4D 61 69 6E 2E 6A 61 76 61 20 7D 20 2D 20 74 65 73 74 20 69 6E 66 6F 72 6D 61 74 69 6F 6E 20 6D 65 73 73 61 67 65 20

因此 STX/ETX 的十六进制值不存在。这意味着不能使用 STX 和 ETX 来检查消息的形成。

【问题讨论】:

  • 你为什么要使用字符串?可以包含 STX 和 ETX 的数据肯定同样可能包含空字符,这将破坏此代码。只需在您调用 recv() 的缓冲区中查找它。 然后组装你的消息,一旦你知道它们在哪里。
  • “numberOfCharactersRead”来自哪里,它的价值是什么?你可能想要(*it).data()(*it).length();在这种情况下,不需要将其转换为 NUL 终止的“c”字符串。转储字符串的十六进制值可能会提供一些见解。
  • @BrianWhite:感谢您提供的信息。 numberOfCharactersRead 是从 recv() 函数接收到的字节数。我也用过 (*it).data() ,但没用。有什么建议吗?
  • @Izza,是的。 “转储字符串的十六进制值可能会提供一些见解。”
  • @Izza 如果您在数据中找不到 STX 或 ETX,您是否考虑过它们不存在的可能性?是因为没有人发送它们,还是因为 STX 在前面的块中而 STX 在后面的块中?

标签: c++ tcp recv stx


【解决方案1】:

好吧,STX 和 ETX 不是“序列”,它们是单个字符。因此,您应该能够使用普通的 @987654321@ 调用来搜索字符。

character values 就是 STX 的 '\x02' 和 ETX 的 '\x03'

请注意,您需要传入收到的尺寸。由于(我假设)不能保证部分接收到的消息是 0 终止的,因此您不能使用 strchr()

【讨论】:

  • 感谢您的回答。用我尝试的方法编辑了原件。但仍然无法检测到 STX。
猜你喜欢
  • 2015-03-26
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多