2011-01-01 16 views
0

ユーザーがネットワークをスキャンできるGUIプログラムがありますが、pcap_loop関数が呼び出されたときにGUIプログラムが応答しなくなるという問題があります(pcap_loopが現在のスレッドをブロックします)。スレッディングとpcapの問題

私はpthreadsを使用しようとすると、pcap_loop関数でSIGSEGVフォルトが発生しました。なぜですか?スレッドがprocPacket関数自体を見ることができないかのようです。

答えて

1

"&"ははるかに少ない必要があります。 &handleを使用するタイプpcap_t **であることが、あなたのスレッド機能は、それを使用した場合、未定義の動作につながる、pcap_t *に(ちなみにキャストは、冗長/無意味である)、それをバックキャスト、および通常ます

 
pcap_t *handle = pcap_open_live(...); 

を想定すると、間違って行くだろう。ベター:

 
static void *pcap_looper(void *arg) 
{ 
     pcap_t *handle = arg; 

     /* etc. */ 

     return NULL; 
} 

int main(void) 
{ 
     pcap_t *handle; 
     pthread_t tid; 
     int ret; 

     handle = pcap_open_live(...); 
     ret = pthread_create(&tid, NULL, pcap_looper, handle); 
     ... 
     pthread_join(tid, NULL); 
     return EXIT_SUCCESS; 
} 
3

あなたは絶対に持っていない限り、私は強くスレッドを使用していないお勧めします。

問題は、競合状態やその他の同期の問題を避けるために非常に注意する必要があることです。例えば、あなたのGUIフレームワークライブラリは、おそらく複数のスレッドから呼び出されることを期待していないので、あなたの//show packets hereルーチンはそれをたくさん混乱させるかもしれません。

代わりに、可能であれば、メインスレッドからパケットを読み取ることをお勧めします。使用しているGUIフレームワークについては言わないでください。あなたはC++を使用しているので、Qtはかなり一般的ですが、他のすべてのフレームワークも同様の機能を持っています。

何をする必要がある:

  • コールpcap_setnonblockは()イベントを監視するファイルディスクリプタを取得するために、非ブロックモードで
  • コールpcap_get_selectable_fdを()キャプチャ記述子を配置する
  • QSocketNotifierオブジェクト(ソケットパラメータとして前のステップのファイル記述子を渡す)を使用して、イベントのファイル記述子を監視する
  • イベントが発生すると、pcap_dispatch()を呼び出してパケットをディスパッチします。
  • 移植性を最大限にするには、select()が一部のOSのpcapソケットでうまく動作しないため、タイマーでpcap_dispatch()を呼び出してください。

は(あなたのコードは、現在のクラッシュである理由を - あなたは、おそらくpthread_create()にパラメータとしてhandlerではなく&handlerを渡したいことに注意してくださいしかし、単にそれは、後に奇妙な信頼性の欠如につながる可能性が固定 - 。そうシングルスレッド起こっていますほぼ確実に前進する方法!)

関連する問題