0

マシンAからマシンBに1500バイトのデータを送信するプログラムをC++で作成しています。

次のように想定します。

char* tx_data = (char*)operator new(1500)
for (int i = 0; i < 1500; i++) {
  tx_data[i] = (char)((int) 65); // ASCII 65 = A;
}
send_tx_data();

したがって、このバッファを埋めるために文字「A」を1500回使用します(tx_data)。受信ホストは受信データを取得してバッファにダンプし(rx_data)、受信データの長さを取得します(rxLength)。

rxLength = recvfrom(sock, rxdata, 1500, 0, NULL, NULL);
           //             ^ the buffer we are putting into

の場合rxLength == 1500、1500バイトのデータを受信しましたが、送信したのと同じ1500バイトであることを確認する必要があります(ネットワークを飛び回る他の場所からの1500バイトのデータではありません)。通常、たとえば、少量のユーザー入力を比較する場合strncmp()に使用されます。ここで適切な提案はしていませstrncmp()んが、私が言っているのは、受信側に、expected_dataたとえば1500x'A'を含むバッファを用意するのは良い考えではないと思うということです。ループして、のように2つを比較しstrncmp()ます。

受信した1500バイトのデータを効率的に評価するにはどうすればよいですか?[効率的とは、すぐに意味します。これは1秒間に数千回発生するため、コードはかなり最適である必要があります!]。何を受け取るべきかがわかっているので、ある種のチェックサムについて考えましたが、これを行うための良い方法がわかりません。誰かが良いチェックサム方法を提案できますか?あるいは、それがばかげた考えである場合、その理由を説明し、おそらく他の何かをお勧めしますか?

4

2 に答える 2

2

まず、マシン A からマシン B に 1500 バイトのデータを送信する特定のプロセスを検討し、このプロセスに損失や破損をもたらす可能性のあるステップがないかどうかを確認します。プロセスにこれらのいずれかを導入するステップがない場合があります。たとえば、TCP/IP を使用してデータを送信している場合、データは基礎となる TCP/IP スタックによって正しく受信されることが保証されます。

一方、データの損失、破損、順序の変更などを導入するいくつかの手順がある場合は、パフォーマンスを重視する場合は CRC を検討する必要があります。CRC の使用に関する完全な説明とソース コードの例については、http ://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code を参照してください。

于 2012-05-21T19:59:03.927 に答える
0

ハッシュ関数と CRC の複数の提案の後、この回答から別の質問へのコードを使用して、単純なハッシュ関数を作成しました。

于 2012-06-10T14:07:37.407 に答える