2017-06-02 44 views
0

我有一个小程序,用于嗅探通过以太网接口传入的原始数据包。我的代码看起来像:原始套接字似乎在某些情况下获得所有数据包,但不是其他数据包

 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,接收后,再加上一些断点,它看起来像我可以改变我的“不工作”的定义为:我只得到正在发送的数据包。我没有收到任何收到的数据包。

回答

0

打算回答我自己的问题。事实证明,无论一次我在另一台具有不同网卡的计算机上尝试它,它都可以正常工作。导致我相信它是我笔记本电脑的以太网接口驱动程序中的一个错误或类似的东西。

相关问题