【发布时间】: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 在后面的块中?