0

私はC SharpWinpcap を使用してパケット スニファに取り組んでいます。正確なコードは次のとおりです。

[DllImport("wpcap.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern IntPtr pcap_open(char[] devicename, int size, int mode, int timeout, ref IntPtr auth, ref IntPtr errbuf);

string devicename = "\\Device\\NPF_{EADB4C21-B0AF-4EF2-86AB-80A37F399D1C}";
IntPtr errbuf = IntPtr.Zero, auth = IntPtr.Zero, iface;
try
{
   iface = pcap_open(devicename.ToCharArray(), 65536, 1, 1000, ref auth, ref errbuf);
}
catch (Exception er) { return; }

pcap_open は、ネットワーク インターフェイスへの有効なポインタを常に返すとは限りません。NULL(0)を返すこともあります。以前は「PInvoke がスタックの不均衡を検出しました...」と表示されていましたが、呼び出し規約を変更して修正しました。charused indevicenameが 1 byteであることも確認しました(charset ansi)。それでも何かがうまくいかない。

単なる観察:デバッグするたびに、常に有効なポインターが返されますが、そうでない場合は、NULL40% の確率で返されます。

私はすべてをチェックインしてチェックアウトし、たくさんグーグルで調べましたが、何もわかりませんでした。何が欠けている可能性がありますか?最悪の部分は、例外をキャッチして適切に処理することさえできないことです。誰か答えがありますか?

4

2 に答える 2

1

0 を返す場合pcap_openは、エラーが発生したことを意味し、errbufnull でない場合は書き込まれます。

たとえば、その回答で指定された方法を使用して、メモリを割り当てます (少なくとも PCAP_ERRBUF_SIZE は 256 バイト)。エラー文字列を表示するか、(string/StringBuilder を使用して)そのようなことを試してください。

[DllImport("wpcap.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr pcap_open(string devicename, int size, int mode, int timeout, IntPtr auth, StringBuilder errbuf);

string devicename = "\\Device\\NPF_{EADB4C21-B0AF-4EF2-86AB-80A37F399D1C}";
try
{
   StringBuilder errbuf=new StringBuilder(256);
   iface = pcap_open(devicename, 65536, 1, 1000, IntPtr.Zero, errbuf);
   Console.WriteLine(errbuf.ToString());
}
catch (Exception er) { return; }
于 2011-09-03T01:40:23.350 に答える
0

ある種の正当なエラーがある可能性があります。iface を IntPtr.Zero に設定してから、IntPtr.Zero に対して pcap_open を呼び出した後に確認しましたか? nullに設定している場合は、nullもチェックできるはずです。

null の場合、errorBuf を文字列に変換して、エラー メッセージが何であるかを確認する必要があるようです。

于 2011-09-03T01:40:23.947 に答える