我有一个小程序,用于嗅探通过以太网接口传入的原始数据包。我的代码看起来像:原始套接字似乎在某些情况下获得所有数据包,但不是其他数据包
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通知像this。
现在,它“工作”时,我建立在调试,但不是当我建立在发布。另外,我在它自己的独立控制台应用程序中,以及在后台线程中工作的另一个应用程序中。在控制台应用程序中它可以工作,但在线程应用程序中它不起作用。
有什么想法?为什么我可能没有得到剩余的数据包?
编辑:再次看到它,并通过wireshark,接收后,再加上一些断点,它看起来像我可以改变我的“不工作”的定义为:我只得到正在发送的数据包。我没有收到任何收到的数据包。