首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pcapdotnet将数据包拆分为2个数据包

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

Stack Overflow用户
提问于 2012-11-07 23:16:04
回答 1查看 1K关注 0票数 0

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

代码语言:javascript
复制
    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);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-08 20:09:17

我从来没有使用过Pcap.Net,所以我不确定这是否有效,但一般的想法是将数据(“有效负载层”)分成几个块,然后发送它。为了确保片段可以重组,您还需要添加有关每个片段的位置(偏移量)的信息。

在Pcap.Net中,IpV4Fragmentation类包含两个定义以下内容的属性:

对于除最后一个片段之外的所有片段,应将其设置为IpV4FragmentationOptions.None,对于最后一个片段,应将其设置为

  • IpV4Fragmentation.Options

  • IpV4Fragmentation.Offset
    • 包含片段的偏移量(必须能被8整除)。对于第一个fragment.

,此偏移量为零

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

(免责声明:这是用记事本写的,我甚至不知道它是否能编译,更不用说正常工作了):

代码语言:javascript
复制
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的建议更新

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13272565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档