【问题标题】:Packet Logging with Pcap for C#使用 C# 的 Pcap 进行数据包记录
【发布时间】:2012-01-31 10:16:45
【问题描述】:

我目前正在使用 C# 的 pcap 库,想知道是否有任何内置函数可以删除 IP 标头和 TCP/UDP/ECT 标头?如果没有,任何人都可以发布他们是如何实现删除此类标题的吗?

【问题讨论】:

    标签: c# logging ip pcap


    【解决方案1】:

    你在使用PacketXLib吗?我以前用过这个,发现它很容易编码。只需了解协议的基本原理,提取标头就足够简单了

    public const int ETHERNETLEN = 14;    // length of ethernet header
    public const int IPLEN = 20;          // length of ip header
    public const int TCPLEN = 20;         // length of tcp header
    

    假设您使用的是与我相同的库,那么您可以绕过标头来获取原始数据

    int dataOffset = ETHERNETLEN + IPLEN + TCPLEN;
    string rawData = "";
    // Throw all the data into a string first up so we can work with it easier
    for (int i = dataOffset; i < aPacket.DataSize; i++)
    {
      byte nByte = (byte)aPacket.DataArray.GetValue(i);
      rawData += Convert.ToChar(nByte);
    }
    

    不过,我正在查看的代码可能已经有将近一年的历史了,所以对于我到底在做什么有点模糊。我正在做一些 http-packet 重建,如我发布的this question 所示。其实,看看那个帖子,我做这个的时候已经是一年多以前了!

    【讨论】:

      【解决方案2】:

      我是 SharpPcap 的作者,它是 c# 的 pcap 包装器/库。

      如果您使用 SharpPcap,SharpPcap 会将数据包分解为数据报。因此,您最终会得到一个包含 IpPacket 的 EthernetPacket,其中包含一个 UdpPacket。如果您只想要 udp 数据包,您可以轻松提取它:

      Packet p = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
      var udpPacket = UdpPacket.GetEncapsulated(p);
      if(udpPacket != null) { Console.WriteLine("found udp packet '{0}'", udpPacket); }
      

      UdpPacket.GetEncapsulated() 遍历数据报寻找数据包。相同的方法适用于所有被解析的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 2014-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多