2017-11-21 7 views
0

私はlibpcapに依存し、2つのスレッドを実行するCプログラムを持っています。 1つの関数はパケットをキャプチャし、送信元IPをchar配列に向かうカスタムパケットに追加します。 2番目の関数は2次元配列を反復処理し、各ソースIPに対してカスタムパケットを送信します。どちらも同時に発生し、どちらも停止しません(永遠にループします)。Cの文字配列に重複が追加されないようにするにはどうすればよいですか?

問題:2番目の関数(送信側)が、唯一の配列の各ループ中に1つの一意のパケットを送信するだけで、速度が重要になります。私は、最初の機能(パケットキャプチャと作成者)が、同じソースのコピーが他のものよりも多くのパケットを取得するという意味で、配列をいっぱいにすることは望ましくありません。配列のサイズが30の場合は、ダイナミックなサイズ変更のハッカーや、しばらくの間実行されたときのbazillionのサイズは必要ありません。それが役立つ場合

は、ここではいくつかの非常に最小限の擬似コードです:Pythonのif not in list機能は、私はハード甘やかさいるように思える

int i = 0; 

char arrayForCustomPackets[30][7]; 
const char stuffIWantInPackets[3] {0x00, 0x00, 0x00}; 

function1(packet) { 
    memory copy packet.IP to arrayForCustomPackets[i] 
    memory copy stuffIWantInPackets to arrayForCustomPackets[i] + 4 
    ++i 
    printf("Hopefully unique IPs captured in array: %d", i); 
} 

function2() { 
    int a = 0; 
    for (a = 0; a < i; a++;) 
     send packet arrayForCustomPackets[a]; 
} 

main() { 
    create threadA(when specific filtered packet has been captured, do function1); 
    create threadB(do function2 forever); 
} 

。これがCや少なくとも私のプログラムではできない場合は、threadCを開く必要があると思います。希望を失ったので、配列を通過するパフォーマンスにあまり厳しくないアルゴリズムであることを期待してください。

+0

これはCです。もちろん、自分でやる必要があります。あなたが望むのはハッシュテーブルです。そのためのライブラリがたくさんあります。 –

+0

私はLinuxカーネルの侵入型リンクリストとハッシュテーブルが好きです。 Googleのために、彼らは速く、堅牢で非常に便利です!もちろん、もしあなたがC++ STLを使うことができれば、それはもっと良くなるでしょう... –

+0

うん、ちょっと読んでハッシュテーブルが必要なようです。おそらく私のコードに入れて苦痛になるだろう。正しい方向に私を指してくれてありがとう! – RSS

答えて

0

重要な値または文字列だけを格納している別の配列を使用して実際に追加する前に、重複の可能性があるかどうかを単純に反復する簡単な解決策が見つかりました。すでに言及された理由のために大きな配列にはお勧めできません。おそらくあまり望ましくないbig-Oアルゴリズムの1つでしょうか?

私がしたことは、専用のチェック配列memcpyを作成してからmemcmpという文字列を、最終配列にすでに処理されているものと比較することでした。合格していないか、すでに処理されているものは、memcmpが0(等しい場合)を返した場合、単純なreturnでドロップされます。上記の擬似コードにソリューションを追加

は、実際には最初の関数が含ま:

char dupeCheck[30][4]; 

function1(packet) { 
    int b = 0; 
    for (b = 0; b < i; b++;) 
     int checker; 
     checker = memcmp(dupeCheck[i], packet.IP, 4); 
     if (checker == 0) 
      return function and start on the next packet 
     else 
      continue below and carry on 

    memory copy packet.IP to dupeCheck[i]; 
    memory copy packet.IP to arrayForCustomPackets[i] 
    memory copy stuffIWantInPackets to arrayForCustomPackets[i] + 4 


    ++i 
    printf("Hopefully unique IPs captured in array: %d", i); 
} 

https://www.tutorialspoint.com/c_standard_library/c_function_memcmp.htm

strcmpをも動作しますが、あなたは私のように2つの配列の一部をまとめて比較する場合クリーナーmemcmpですIP /値は異なるインデックスに格納されたオクテットを持っていたので、私は簡単に0から3のインデックスをカバーするためにサイズ4を使うことができました。 strcmpを使用すると、より多くの比較や追加が必要になります。

関連する問題