使用 pcapdotnet 将数据包拆分为 2 个数据包

2024-03-06

如何使用 pcapdotnet 将一个数据包分成两个数据包?这是我尝试过的,但不知道是否正确:

    public IEnumerable<Packet> splitPacket(Packet packet)
    {
        EthernetLayer ethernet = (EthernetLayer)packet.Ethernet.ExtractLayer();
        IpV4Layer ipV4Layer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();
        DateTime packetTimestamp = packet.Timestamp;
        ILayer payload = packet.Ethernet.IpV4.Payload.ExtractLayer();
        IpV4Fragmentation.Equals(packet, packet);

        yield return PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, payload);
    }

我从未使用过 Pcap.Net,所以我不确定这是否有效,但总体思路是将数据(“有效负载层”)分割成几个块,然后发送。为了确保片段可以重新组装,您还需要添加一些有关位置的信息(offset)的每个片段。

在 Pcap.Net 中,IpV4Fragmentation类包含两个定义此属性的属性:

  • IpV4Fragmentation.Options:
    • 对于除最后一个之外的所有片段,应将其设置为IpV4FragmentationOptions.MoreFragments,
    • 对于最后一个片段,应设置为IpV4FragmentationOptions.None
  • IpV4Fragmentation.Offset:
    • 包含片段的偏移量(必须能被 8 整除)。对于第一个片段,该偏移量为零。

考虑到这一点,我会写这样的东西:

(免责声明:这是用记事本编写的,我不知道它是否可以编译,更不用说它应该如何工作):

public IEnumerable<Packet> Split(Packet packet, int numberOfFragments)
{
    // get original layers
    var ethernet = (EthernetLayer)packet.Ethernet.ExtractLayer();
    var ipV4 = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();
    var time = packet.Timestamp;

    // extract the data
    var payload = (PayloadLayer)packet.Ethernet.IpV4.Payload.ExtractLayer();
    var totalLength = payload.Length;

    // split data into smaller segments
    var partialLength = totalLength / numberOfFragments;

    // make sure it's divisible with 8
    // (see http://en.wikipedia.org/wiki/IPv4#Fragmentation_and_reassembly)
    partialLength = (partialLength / 8) * 8;

    // send one by one
    var offset = 0;
    while (offset < totalLength)
    {
        // get length for this fragment
        var fragmentLength = partialLength;
        var options = IpV4FragmentationOptions.MoreFragments;            

        // is this the last fragment? trim length if needed
        if (offset + fragmentLength >= totalLength) 
        {
            options = IpV4FragmentationOptions.None;
            fragmentLength = totalLength - offset;
        }

        // copy the actual data into a new buffer
        var newBuffer = payload.ReadBytes(offset, fragmentLength);
        var newPayload = new PayloadLayer() { Data = newBuffer };

        // change IP layer fragmentation options
        ipV4.Fragmentation = new IpV4Fragmentation(options, offset);

        // return it
        yield return PacketBuilder.Build(time, ethernet, ipV4, newPayload);

        // next offset
        offset += fragmentLength;
    }
}

[根据@brickner的建议更新]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pcapdotnet 将数据包拆分为 2 个数据包 的相关文章

随机推荐

  • pop eip 指令合法吗?

    我正在参加大学的理论考试 并被问到这个问题 经过一些指令后 esp 增长了 4 eip 增长了 20 该指令可能是什么 我标记了 pop eip 和 ret nasm 32位汇编中是否可以执行pop eip指令 pop eip不是真正的 x
  • 在 Shopify 中更新/删除购物车属性

    我使用购物车属性将每个产品的额外信息添加到购物车 从产品页面 我专门使用购物车属性 over 行项目属性因为客户需要能够稍后按订单编辑此信息 而订单项属性不允许 添加信息工作得很好 当客户决定从购物车中删除商品时 问题就出现了 因为尽管该商
  • 毕达哥拉斯三倍效率

    我需要创建一个函数 它接受整数列表并返回列表中是否存在毕达哥拉斯三元组 例如 3 5 7 4 回报True因为 3 4 5 是毕达哥拉斯三元组 到目前为止我有这个 Python def containsPythagoreanTriple a
  • 如何 boost::bind 到传递并返回 std::string 的托管类的成员?

    我正在尝试做一些非常类似的事情this https stackoverflow com questions 163757 how to use boostbind in c cli to bind a member of a managed
  • 找不到记录器“apscheduler.scheduler”的处理程序

    from apscheduler scheduler import Scheduler import os class ListHref def init self print In ListHref Class self name hre
  • 如何计算 pandas 中每个唯一值的出现次数

    我有一个大的 pandas 数据框 我想计算其中每个唯一值的出现次数 我尝试遵循 但需要花费大量时间和内存使用量 我怎样才能以Pythonic的方式做到这一点 pack for index row in packets iterrows p
  • 动态禁用 jQuery Datepicker 图标

    我对 jQuery 相当陌生 并且我一直在寻找一个像样的免费日期选择器有一段时间了 我对 jQuery UI 的日期选择器非常满意 但我遇到了障碍 我使用它的项目要求我在文本框旁边有一个图标 虽然这相当简单 但我不知道如何动态禁用该图标 有
  • 在 MATLAB 中单击图像时从指针获取索引值

    如何找到点击点的索引并将其添加到数组 列表或向量的末尾 h figure image result locx locy while ishandle h pos get 0 PointerLocation locx end 1 pos 1
  • RuntimeException:在注册表中找不到应用程序“”。

    背景 目标 我尝试在 Windows 7 64 位上安装 Simics Tools for Eclipse 插件 我正在使用 Eclipse Indigo for Java 64 位 为了解决这个问题 我决定在当前设置旁边安装 32 位版本
  • 将 LWJGL java 应用程序放入 jpanel 或 canvas 中

    随着 lwjgl 3 的新更新 类 Display 不存在 我到处搜索 但找不到任何有关如何将所有 lwjgl 应用程序放入 jpanel 或画布或类似内容的内容 我已经想过使用像 twl 这样的 opengl gui 但这会让一切变得更加
  • iOS 6 中的分段控件tintColor

    我有一个有 8 段的分段控件 我可以更改整个控件的默认色调 但是我可以为控件中的每个部分设置不同的颜色吗 我找到了一个在 5 1 中使用的教程 其中有一个调用此方法的新类 void setTintColor UIColor color fo
  • onCreate 流程在 finish() 之后继续

    我想从内部完成一项活动onCreate方法 当我打电话时finish onDestroy 不会立即调用 代码不断流过finish onDestroy 直到之后才被调用onCreate 右大括号 Per the onCreate 描述位于de
  • 展开两个大数据文件并使用data.table应用?

    我正在尝试将函数应用于两个数据集df1 and df2 where df1包含 a b 并且可以有 100 万行长 并且df2包含 x y z 并且可以非常大 从 100 到 gt 10 000 我想应用一个函数foo对两个数据集的每个组合
  • SwiftUI ForEach 'identified(by:)' 已弃用。使用 ForEach(_:id:) 或 List(_:id:)

    在 XCode 11 beta 4 上 以下内容似乎已被弃用 我不知道如何重写它 有谁知道如何使用ForEach id State private var showTargets id 1 state false x 109 28 y 10
  • 永远的nodejs:如何运行我的npm应用程序

    现在我正在运行我的 Node js 应用程序npm start 我想在后台运行它 我发现forever包 但不知道如何运行我通常运行的应用程序npm start 那么我怎样才能使用它来运行它forever 我跟随this SO https
  • jqGrid 有 CDN 吗?

    谁知道有没有CDNjqGrid http www trirand com blog Thanks Here is JQgrid 的 CDN http www jsdelivr com jqgrid 不过 不是最小版本 http www js
  • Laravel 上的 Amazon S3 ERR_INSECURE_RESPONSE

    我在我的子域上使用 Laravel 框架sub example com尝试为我网站的所有图片实现与 Amazon S3 的连接 这是我的存储桶政策 bucket 1 Id Policy Version 2012 10 17 Statemen
  • 在 Woocommerce 的某些页面上添加产品 ID 的星级评级

    有没有办法在自定义页面 自定义位置调用特定产品的星级 换句话说 我是否可以添加特定 T 恤的星级 以显示在主页上该 T 恤图片的下方 我想我需要向编辑器添加某种 php 然后通过某种 html 调用它 我看见这个回答的话题 https st
  • python 阿拉伯语编码问题

    我有一个带有 windows 1256 编码的文本 现在我想将文本从阿拉伯语 windows 1256 转换为utf 8 示例文本 result 我用这个代码来解码和编码为utf 8 coding utf 8 data print data
  • 使用 pcapdotnet 将数据包拆分为 2 个数据包

    如何使用 pcapdotnet 将一个数据包分成两个数据包 这是我尝试过的 但不知道是否正确 public IEnumerable