Работая в WinPcap, pcap_open не всегда возвращает указатель - PullRequest
0 голосов
/ 03 сентября 2011

Я работаю над анализатором пакетов в C Sharp с использованием Winpcap. Вот точный код:

[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 обнаружил дисбаланс стека ...», я исправил это, изменив соглашение о вызовах.Я даже убедился, что char, используемый в devicename, имеет 1 байт (charset ansi).Тем не менее, что-то идет не так.

Просто замечание: всякий раз, когда я отлаживаю его, он всегда возвращает действительный указатель, но если нет, он возвращает NULL 40% случаев.

Я проверил все в и из, много гуглил, но ничего не смог понять.Чего не хватает?Хуже всего то, что я даже не могу поймать исключение, чтобы обработать его должным образом.У кого-нибудь есть ответ?

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Если pcap_open возвращает 0, это означает, что произошла ошибка, и она будет записана в errbuf, если она не равна нулю.

Выделите для нее некоторую память (по крайней мере, PCAP_ERRBUF_SIZE, что256 байт), например, с помощью метода, указанного в , который отвечает , затем отобразите строку ошибки или попробуйте что-то подобное (со строкой / 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; }
0 голосов
/ 03 сентября 2011

Может быть, есть какая-то законная ошибка.Вы пробовали установить для iface значение IntPtr.Zero, а затем проверить, вызвали ли вы pcap_open для IntPtr.Zero?Если для него установлено значение null, вы также должны иметь возможность проверять наличие нуля.

Когда значение равно null, похоже, что вы захотите преобразовать errorBuf в строку, чтобы узнать, что представляет собой сообщение об ошибке.

...