【问题标题】:how can I parse a UDP packet in .NET?如何在 .NET 中解析 UDP 数据包?
【发布时间】:2011-03-31 22:04:24
【问题描述】:

如何在 .NET 中解析 UDP 数据包?

我正在使用 PCap.Net 来捕获数据包,在这种情况下是 UDP 数据包,我可以通过 (PcapDotNet.packets.Ethernet.IpV4.Udp) 从 PCap.net 对象访问它。

如何获取结果、Udp 数据包并对其进行解析?特别是解绑 UDP 数据包中发生的 DNS 请求和响应。

这里有可以提供帮助的库吗?

编辑:更具体地说,我想要做的是从 DNS 响应中提取 IP 地址,并根据使用 Wireshark 的检查,它将是:

(a) 输入:作为 DNS 响应的 UDP 数据包的有效负载

(b) 处理:解析出 UDP 数据包的 DNS 响应部分。找到 Answers 部分,在此找到类型为 A(主机地址)[不是 CNAME 记录]的答案记录,然后使用此答案记录获取 IP 地址。

(c) 返回:来自 DNS 响应的 IP 地址。

【问题讨论】:

  • WinPCAP不是自带一堆解析器吗?
  • 转到Newtwork Monitor API microsoft.com/downloads/…
  • @Will - 我可以深入了解 UDP,但它只是解析携带我感兴趣的 DNS 响应的 UDP 数据包的详细信息。
  • @Amit - 你是否建议我使用 PCap.Net 进行数据包捕获,一旦我获得了 UDP 有效负载,就有可以在 Microsoft 网络监视器中使用的 UDP/DNS 解析器图书馆?
  • 我已经在你的其他相关问题中给了你一堆指针(包括相关的 RFC)。请去阅读那个 RFC - 你会学到一个该死的网站,而不仅仅是使用别人的 API。

标签: c# .net dns udpclient pcap.net


【解决方案1】:

来自 PCAP.Net:

Pcap.Net.DevelopersPack.0.7.0.46671.x64\src\InterpretingThePackets\Program.cs

            // Compile the filter
            using (BerkeleyPacketFilter filter = communicator.CreateFilter("ip and udp"))
            {
                // Set the filter
                communicator.SetFilter(filter);
            }

            Console.WriteLine("Listening on " + selectedDevice.Description + "...");

            // start the capture
            communicator.ReceivePackets(0, PacketHandler);
    }


    // Callback function invoked by libpcap for every incoming packet
    private static void PacketHandler(Packet packet)
    {
        // print timestamp and length of the packet
        Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length);

        IpV4Datagram ip = packet.Ethernet.IpV4;
        UdpDatagram udp = ip.Udp;

        // print ip addresses and udp ports
        Console.WriteLine(ip.Source + ":" + udp.SourcePort+ " -> " + ip.Destination + ":" + udp.DestinationPort);
    }

还不够吗?

【讨论】:

  • 我可以使用 PCap.Net 处理 UDP 数据包,但它正在解析携带我感兴趣的 DNS 响应的 UDP 数据包的详细信息。基本上希望能够拥有一个 DNS 响应 UDP 数据包,然后对其进行解析以获取 DNS 数据包的应答记录中的 IP 地址(类型 A(不是 CNAME 类型))。所以基本上能够解析出 UDP/DNS 数据包的 DNS 部分。
  • 现在问题更清楚了。好吧,几年前我能够从 DNS 数据包中提取 IP。我只使用了一些 RFC。试试这个:pjsip.org/pjlib-util/docs/html/group__PJ__DNS__PARSING.htm
【解决方案2】:

我找到了以下项目,其中包含执行此操作的代码

http://www.codeproject.com/KB/IP/dnslookupdotnet.aspx

特别是 Response.cs 类。另请注意,代码中有一个错误,但页面上的 cmets 突出显示了它的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多