使网络接口接收(收听)数据包

时间:2013-03-14 22:01:28

标签: c# networking winpcap pcap.net

我需要使用PcapDotNet或其他任何东西使Microsoft Loopback Adapter接收(收听)数据包。我怎么能这样做?

感谢。

2 个答案:

答案 0 :(得分:3)

您不能使用PCAP从Windows上的环回适配器捕获数据包。但是,您可以使用名为RawCAP的工具来执行此操作并输出.pcap文件(您可以在WireShark中打开:http://wiki.wireshark.org/CaptureSetup/Loopback)。

答案 1 :(得分:0)

您的问题不具体,也不十分详细,因此您会得到一个广泛的解释。 Microsoft .Net Framework 4.5实际上有一个完全可以处理这个名为NetworkInterface的类。

The Microsoft Developer Network actually explains in great detail these class requirements.

  

此特定类也封装了网络接口的数据   在本地计算机上称为适配器。您不创建实例   这个班级; GetAllNetworkInterfaces方法返回一个数组   包含每个网络接口的此类的一个实例   本地电脑。

因此,您可以看到它需要半特定的细节,否则它将失败。因为它可能会尝试未连接的适配器。您的问题让我相信,您尝试ping一个有效的数据包到您的本地适配器以验证是否有响应。

您甚至拥有NetworkInformation命名空间,它提供了大量相关的information。一个非常非常简单的实现就像:

Ping pingSender = new Ping();
PingOptions options = new PingOptions();

// Default Time To Live (TTL) but don't fragment request.
options.DontFragment = true;

// Create a buffer of 32 Bytes:
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);

// Timeout
int timeout = 120;

// Ping and Request Reply
pingReply reply = pingSender.Send(args[0], timeout, buffer, options);
if(reply.Status == IPStatus.Success)
{
     Console.WriteLine("Address: {0}, reply.Address.ToString());
     Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
     Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
     Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
     Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length); 
}    

您只需将Ping请求用于127.0.0.1,因为这是您当前正在使用的网卡的环回地址。

回复将指示是否收到您的信息包。

是的,Loopback会收到回复,知道您的卡正在使用中。但在大多数情况下可以忽略它;因为地址仅在您收到请求时显示有用的信息。

如果您不喜欢Ping的想法,请选择其他选项。只需将NetworkInterface设置为侦听更改:

NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface n in adapters)
{
      Console.WriteLine("   {0} is {1}", n.Name, n.OperationalStatus);
}

这是测试卡片响应的两种有效方法。如上所述,除非您专门向环回地址发送请求,否则Loopback不会主动“接收”任何内容。

希望这有帮助。