因此,我花了一个下午尝试使用 SharpPcap 和 Packet.Net 在 C# 中发送 LLDP 数据包。
我想出了一个带有 NullReferenceException 的炸弹。我知道为什么,但我不知道该怎么办。
这是我的代码:
namespace LLDPTest {
using System;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading;
using PacketDotNet;
using SharpPcap.WinPcap;
class Program {
static void Main(string[] args) {
//var timer = new Timer(state => SendLLDPPacketOnAllInterfaces(), null, 0, 1000);
SendLLDPPacketOnAllInterfaces();
Console.ReadLine();
}
private static void SendLLDPPacketOnAllInterfaces() {
var winPcapDeviceList = WinPcapDeviceList.Instance;
foreach (var device in winPcapDeviceList.Where(device => device.Interface.GatewayAddress != null)) {
SendLLDPPacket(device);
}
}
private static void SendLLDPPacket(WinPcapDevice device) {
var packet = LLDPPacket.RandomPacket();
//packet.Header = ???
var ethernetPacket = new EthernetPacket(device.Addresses[1].Addr.hardwareAddress, PhysicalAddress.Parse("01-80-C2-00-00-0E"), EthernetPacketType.LLDP);
ethernetPacket.PayloadPacket = packet;
device.Open();
device.SendPacket(ethernetPacket);
device.Close();
Console.WriteLine("LLDP packet sent!");
}
}
}
异常在第 36 行 ( device.SendPacket(ethernetPacket);
)
原因是数据包的标头属性不能为空。在 Packet.cs 的第 229 行抛出异常,执行以下检查:
if ((this.header.Bytes != this.payloadPacketOrData.ThePacket.header.Bytes) || ((this.header.Offset + this.header.Length) != this.payloadPacketOrData.ThePacket.header.Offset))
{
return false;
}
长话短说,我根本不知道应该将 header 属性设置为什么,Google 或其他任何地方都没有示例。
编辑: this.payloadPacketOrData.ThePacket.header
为空。这是调用 产生的数据包LLDPPacket.RandomPacket();
。不幸的是,标头属性没有设置器。
EDIT2:我正在使用来自 NuGet 的两个数据包的最新版本。
EDIT3: http ://wiki.wireshark.org/LinkLayerDiscoveryProtocol说
有趣的是,与上面提到的 LLDP 草案不同,最终的 LLDP 标准放弃了 LLDP 标头的概念,而是简单地要求存在某些 TLV。在各种草稿文件中,LLDP 标头应该包含一个版本字段。当前的 LLDP 标准不包括任何版本的概念。