我正在使用Winpcap在C Sharp
中处理数据包嗅探器,这是确切的代码:
[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%的时间。
我已经检查了所有内容用Google搜索,但无法弄清楚任何事情。可能会遗漏什么? 最糟糕的是,我甚至无法捕获异常来正确处理它。有人有答案吗?
答案 0 :(得分:1)
如果pcap_open
返回0,则表示存在错误,如果它不为空,则会写入errbuf
。
为它分配一些内存(至少PCAP_ERRBUF_SIZE为256字节),例如,使用that answer中给出的方法,然后显示错误字符串或尝试类似的东西(使用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; }
答案 1 :(得分:0)
可能存在某种合法错误。您是否尝试过将iface设置为IntPtr.Zero,然后检查您是否针对IntPtr.Zero调用pcap_open?如果它将其设置为null,您也应该能够检查null。
如果它为null,看起来您将要将errorBuf转换为字符串以查看错误消息是什么。