我有一个小程序,我正在嗅探以太网界面上的原始数据包。我的代码看起来像:
Socket ReceiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
EndPoint DefaultIPEndpoint = new IPEndPoint(IPAddress.Parse("10.0.2.0"), 0); // 10.0.2.0 is static ip on ethernet interface
ReceiveSocket.ReceiveTimeout = 5000;
ReceiveSocket.Bind(DefaultIPEndpoint);
ReceiveSocket.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, null);
while (true)
{
byte[] ReceiveBuffer = new byte[512];
int ByteCount = 0;
ByteCount = ReceiveSocket.ReceiveFrom(ReceiveBuffer, ref DefaultIPEndpoint);
// Handle Packets...
}
我发现这仅在某些实现中起作用。通过工作,我的意思是它实际上接收了接口上的所有数据包。我可以使用Wireshark查看即将发生的事情,所以我知道我应该收到多少流量,以及"何时不起作用"。它只收到少数数据包,它们只是广播(10.0.255.255(,而http notify则是这样的。
现在,它是"有效的"当我在调试中构建时,但是当我构建发行版时。此外,我在其自己的独立控制台应用程序以及另一个在背景线程中起作用的应用程序中都有此功能。在控制台应用程序中它可以正常工作,但是在线程应用程序中它不起作用。
有什么想法吗?为什么我可能不拿到其余数据包的原因?
编辑:再次查看它,通过Wireshark,以及收到后的一些断点,看来我可以更改"不工作"的定义。到:我只会发送数据包。我没有收到任何数据包。
将回答我自己的问题。事实证明,一旦我在用不同的NIC的其他计算机上尝试过,它都可以正常工作。导致我相信这是我笔记本电脑的以太网接口驱动程序或类似物品中的错误。