套接字接收

我试图在c#中捕获ip数据包。 一切都运行正常,除了我只得到传出的数据包。

我的代码:

using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)) { sock.Bind(new IPEndPoint(MYADDRESS, 0)); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true); sock.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(1), null); while (true) { byte[] buffer = new byte[sock.ReceiveBufferSize]; int count = sock.Receive(buffer); // ... } } 

问题绝对是我的电脑! 但也许有一个解决方法……

Windows防火墙很可能阻止了传入的数据包。 将您的程序添加到防火墙排除项。

使用带有SharpPcap的 .Net的WinPcap的不同方法怎么样( 更多信息 )

它提供了一个API,用于使用任何.NET语言(如C#和VB.NET)捕获,注入,分析和构建数据包

……听起来更有希望

我认为问题是你绑定到环回IP,假设你的代码中的’LOCALHOST’意味着127.0.0.1。 尝试绑定到要捕获数据包的接口的IP地址。

我对你的代码做了一个快速测试,我肯定看到数据在两个方向上流动,使用Windows 7. 注意我以管理员身份运行它,不知道它的运行情况如何。

  using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)) { sock.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.121"), 0)); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true); sock.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(1), null); while (true) { byte[] buffer = new byte[sock.ReceiveBufferSize]; int count = sock.Receive(buffer); IpHeader hdr = IpHeader.FromPacket(buffer, count); if ((ProtocolType)hdr.Protocol == ProtocolType.Tcp) { Console.WriteLine("{0} : {1} -> {2}", (ProtocolType)hdr.Protocol, new IPAddress(hdr.SrcAddr).ToString(), new IPAddress(hdr.DestAddr).ToString()); } } } 

IpHeader来自我多年前写的一个库 ,我用它来快速解码数据包,以确保我看到两个方向的数据。

以下是从上面的代码中快速捕获来validation(AA.BB.CC.DD是我的公共IP)

 Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : AA.BB.CC.DD -> 83.221.14.72 Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : AA.BB.CC.DD -> 83.221.14.72 Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : AA.BB.CC.DD -> 83.221.14.72 Tcp : AA.BB.CC.DD -> 83.221.14.72 Tcp : AA.BB.CC.DD -> 83.221.14.72 Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : 83.221.14.72 -> AA.BB.CC.DD Tcp : AA.BB.CC.DD -> 83.221.14.72 

在我的情况下,我不得不在Windows防火墙中允许vshost.exe

我认为问题出在IOControl调用中。 说实话,我并不真正理解MSDN提供的关于这个函数的文档,但是在codeproject( 这里 )中有一个关于这个主题的例子,我的猜测是通过在最后一个参数中传递null你没有得到传入的数据包。 试试这个:

 byte[] byTrue = new byte[4]{1, 0, 0, 0}; byte[] byOut = new byte[4]; sock.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);