Итак, я провел день, пытаясь отправить пакет LLDP на С#, используя SharpPcap и Packet.Net.
Что я придумал бомбы с 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);
)
Причина этого в том, что свойство заголовка пакета не должно быть нулевым. Исключение выдается в строке 229 файла Packet.cs, где выполняется следующая проверка:
if ((this.header.Bytes != this.payloadPacketOrData.ThePacket.header.Bytes) || ((this.header.Offset + this.header.Length) != this.payloadPacketOrData.ThePacket.header.Offset))
{
return false;
}
Короче говоря, я просто не знаю, что я должен установить для свойства заголовка, в Google или где-либо еще нет примеров.
EDIT: this.payloadPacketOrData.ThePacket.header
равно null. Это пакет, полученный в результате вызова LLDPPacket.RandomPacket();
. К сожалению, свойство заголовка не имеет установщика.
EDIT2: я использую последние версии обоих пакетов от NuGet.
EDIT3: http://wiki.wireshark.org/LinkLayerDiscoveryProtocol говорит, что
Интересно отметить, что в отличие от проектов LLDP, упомянутых выше, окончательный стандарт LLDP отказался от понятия заголовка LLDP и вместо этого просто предписывал наличие определенных TLV. В различных проектах документов заголовок LLDP должен был включать поле «Версия». Текущий стандарт LLDP не включает понятие версии.