1

c ++でrecv()によって受信されたメッセージでSTX(テキストの開始)およびETX(テキストの終了)文字シーケンスを検出する方法はありますか? 完全なメッセージを再作成できるように、TCP で発生する可能性のある部分的な読み取りを修正しようとしています。

ありがとうございました!

EDIT1:

アンワインドによる回答に従って、次のことを行いました。

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:

サンプル メッセージの次の 16 進値を取得しました。

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 の 16 進値は存在しません。つまり、メッセージの形成を確認するために STX と ETX を使用することはできません。

4

1 に答える 1

8

STX と ETX は「シーケンス」ではなく、単一の文字です。memchr()したがって、通常の呼び出しを使用して文字を検索できるはずです。

文字値'\x02'、STX と'\x03'ETXの場合のみです。

受け取ったサイズを渡す必要があることに注意してください。部分的に受信されたメッセージが 0 で終了するという保証はありません (私は思います) ので、 を使用することはできませんstrchr()

于 2012-10-24T10:03:18.087 に答える