c# - 在 WinPcap 中工作,pcap_open 并不总是返回一个指针

标签 c# c++ stack-overflow winpcap

我正在使用 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 并不总是返回指向我的网络接口(interface)的有效指针。有时它返回 NULL (0)。它曾经显示“PInvoke 检测到堆栈不平衡...”,我通过更改调用约定来纠正它。我什至确保 devicename 中使用的 char 是 1 字节 (charset ansi)。仍然有问题。

只是一个观察:每当我调试它时,它总是返回一个有效的指针,但当我不这样做时,它会返回 NULL 40% 的时间。

我检查了所有进出的东西,用谷歌搜索了很多但还是找不到任何东西。可能缺少什么? 最糟糕的是,我什至无法捕获异常以正确处理它。有人有答案吗?

最佳答案

如果pcap_open返回0,表示有错误,如果不为null则写入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; }

关于c# - 在 WinPcap 中工作,pcap_open 并不总是返回一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290539/

相关文章:

c++ - 为什么 std::copy_n 不增加输入迭代器 n 次?

c# - Type.GetType() 抛出 StackOverflowException

c# 正则表达式匹配排除第一个和最后一个字符

C# Linq-to-SQL 尝试接收多个选择

c++ - 使用 asio null_buffers boost asio udp 套接字

c++ - 如何查看哪些预处理器宏扩展为使用/P?

c# - 运算符重载导致堆栈溢出

Java 正则表达式匹配开始/结束标记导致堆栈溢出

c# - 如何获取页面源并使用Watin进行搜索

c# - 从 Active Directory 组获取用户