因此,我花了一个下午的时间试图用c#和SharpPcap和Packet.Net发送一个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);)中抛出。
原因是数据包的报头属性不能为null。在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();的调用产生的数据包。不幸的是,header属性没有setter。
EDIT2: --我正在使用来自NuGet的两个包的最新版本。
EDIT3: http://wiki.wireshark.org/LinkLayerDiscoveryProtocol说
值得注意的是,与上面提到的LLDP草案不同,最终的LLDP标准放弃了LLDP头的概念,而只是简单地规定了某些TLVs的存在。在各种文件草稿中,LLDP标题应该包括一个Version字段。目前的LLDP标准不包括任何版本的概念。
发布于 2015-01-20 15:26:29
叹一口气。我不知道为什么,但是在检查了单元测试(https://github.com/antmicro/Packet.Net/blob/master/Test/PacketType/LldpTest.cs)之后,我偶然发现了解决方案(第78-79行):
var packet = LLDPPacket.RandomPacket();
var lldpBytes = packet.Bytes;
var lldpPacket = new LLDPPacket(new ByteArraySegment(lldpBytes));我不知道为什么作者所说的“修复”是必要的,但现在起作用了。
https://stackoverflow.com/questions/28048168
复制相似问题