我正在尝试使用pcap.net,并希望实现一些响应ping作为练习的东西。操作系统已对它们做出响应,但我可以生成重复项。第一步显然是知道ping数据包已经到达。我在https://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Opening%20an%20adapter%20and%20capturing%20the%20packets&referringTitle=Pcap.Net%20User%20Guide修改了示例以使用以下处理程序。
我显然不明白发生了什么,因为没有捕获的数据包甚至在正确的子网上。将ping数据包发送到目标IP没有任何区别,尽管使用ping -i 0会大量增加接收数据包的数量(但它们仍然没有合理的IP地址,并且似乎不是echo-request数据包)。
我做错了什么?
private static void PacketHandler(Packet packet)
{
IpV4Address dst = packet.IpV4.Destination, src = packet.IpV4.Source;
if (dst == null || src == null) return;
if (packet.IpV4.Icmp != null)
{
Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length+" "+src+" -> "+dst);
}
}
答案 0 :(得分:2)
显然,我打算写的是以下内容。它可靠地获取传入和传出的icmp echo请求。我不知道为什么我也不会看到大量的TCP数据包经过,因为我已经进入运行它的计算机。但它似乎对我想做的事情做得很好。
private static void PacketHandler(Packet packet)
{
if (packet.DataLink.Kind != DataLinkKind.Ethernet) return;
EthernetDatagram ed = packet.Ethernet;
if (ed.EtherType != EthernetType.IpV4) return;
IpV4Datagram ipv4 = ed.IpV4;
if (ipv4.Protocol != IpV4Protocol.InternetControlMessageProtocol) return;
IcmpDatagram icmp = ipv4.Icmp;
IpV4Address dst = ipv4.Destination, src = ipv4.Source;
Console.WriteLine(" length:" + packet.Length + " " + src + " -> " + dst + " " + icmp);
}