有沒有辦法在C++中通過recv()接收的消息中檢測到STX(文本開始)和ETX(文本結束)字符序列?我正在修復TCP中可能發生的任何部分讀取,以便我可以重新構建完整的消息。在C++中查找STX和ETX字符串
謝謝!
EDIT1:
做了以下按答案由開卷:
char c = '\x02';
if(memchr((*it).c_str(), c, numberOfCharactersRead) != NULL)
cout << "STX found" << endl;
我仍然沒能檢測出人物。這個實現的任何問題? '它'是一個字符串類型的向量的迭代器。
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()的緩衝區中查找它即可。 *一旦你知道他們在哪裏,然後*組裝你的消息。 – EJP
「numberOfCharactersRead」從哪裏來,它的價值是什麼?你可能需要'(* it).data()'和'(* it).length()';在這種情況下,不需要將其轉換爲NUL終止「c」字符串。轉儲字符串的十六進制值可能會提供一些見解。 –
@BrianWhite:感謝您的信息。 numberOfCharactersRead是從recv()函數接收的字節數。我也使用了(* it).data(),並沒有工作。有什麼建議麼? – Izza