2012-10-24 477 views
1

有沒有辦法在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來檢查消息的形成。

+0

你爲什麼使用字符串?可以包含STX和ETX的數據肯定可能包含空字符,這將打破這些代碼。只需在您調用recv()的緩衝區中查找它即可。 *一旦你知道他們在哪裏,然後*組裝你的消息。 – EJP

+0

「numberOfCharactersRead」從哪裏來,它的價值是什麼?你可能需要'(* it).data()'和'(* it).length()';在這種情況下,不需要將其轉換爲NUL終止「c」字符串。轉儲字符串的十六進制值可能會提供一些見解。 –

+0

@BrianWhite:感謝您的信息。 numberOfCharactersRead是從recv()函數接收的字節數。我也使用了(* it).data(),並沒有工作。有什麼建議麼? – Izza

回答

7

那麼,STX和ETX不是「序列」,它們是單個字符。因此,您應該可以使用簡單的memchr()調用來搜索字符。

對於STX,character values只不過是'\x02',ETX是'\x03'

請注意,您將需要傳入收到的大小。由於(我假設)不能保證部分接收的消息是以0結尾的,所以不能使用strchr()

+0

感謝您的回答。用我試過的東西編輯原文。但仍然無法檢測到STX。 – Izza