使用SharpPcap和Packet.Net发送LLDP数据包

时间:2015-01-20 14:45:16

标签: c# sharppcap packet.net

所以,我花了一个下午尝试使用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);

中引入了异常

原因是数据包的header属性不能为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;
                }

长话短说,我根本不知道应该将标题属性设置为什么,Google或其他任何地方都没有示例。

编辑: this.payloadPacketOrData.ThePacket.header为空。这是调用LLDPPacket.RandomPacket();产生的数据包。不幸的是,header属性没有setter。

EDIT2:我正在使用NuGet的两个数据包的最新版本。

EDIT3: http://wiki.wireshark.org/LinkLayerDiscoveryProtocol

  

值得注意的是,与上面提到的LLDP草案不同,   最终的LLDP标准放弃了LLDP标题的概念   而只是强制要求存在某些TLV。在各种   草案文件LLDP Header应该包含一个版本   领域。目前的LLDP标准不包括任何a的概念   版本

1 个答案:

答案 0 :(得分:1)

叹息。我不明白为什么,但在检查了单元测试(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));

我不知道为什么作者会打电话给#34; reparsing"是必要的,但现在它有效。