-2

如何根据 tcp 标志重新组装 TCP 数据包值:

我期待这样的代码:

public void device_onPacketArrival(object sender, CaptureEventArgs e)
{
var tcpPacket=TcpPacket.GetEncapsulated(PacketDotNet.Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data));
if(tcpPacket.Allflags.toString()== something means that this is the last part of the fragmented packet)
stop reassampling procedure 
else
continuing reassembling procedure 
}

我唯一想要的是知道标志的值意味着这是碎片数据包的最后一部分吗?

4

6 回答 6

5

因为您使用%d, 用于十进制整数,而不是%f%g用于双精度数。

于 2013-08-27T19:25:36.970 回答
2

因为%d不是 a 的格式说明符double,它是 a 的int。您应该使用正确的格式字符串,例如%f.

于 2013-08-27T19:25:24.663 回答
2

查找printf格式说明符%d用于整数值。你想要的可能是%f%e%g或类似。看看这个例子:

例子:

#include <stdio.h>

int main() {
    double x = 3.141;
    printf("%d\n", x);
    printf("%e\n", x);
    printf("%f\n", x);
    printf("%g\n", x);
}

输出是:

$ gcc test.c && /a.out
154573528
3.141000e+00
3.141000
3.141

请注意,这printf本质上是类型不安全的。在上面的示例中,您会看到使用整数格式说明符的输出与其他输出完全不同。那是因为没有进行转换,而是直接将字节模式解释为另一种类型,从而可能导致无效的内存访问。

免责声明:请注意,使用电锯通常比printf使用电锯更危险。但是,如果您不关心手中握着什么末端以及指向您尝试切割的木材的末端,您的里程可能会有所不同。因此,您应该仔细查看您使用的函数的文档。

以供参考:

于 2013-08-27T19:25:38.053 回答
2

指定的格式“%d”定义了一个整数而不是一个双精度变量。

使用“%e”或“%g”。

于 2013-08-27T19:26:09.747 回答
1

可能已经说过了,但是由于您将数组变量声明为双精度数据类型,因此您不能突然使用 %d 打印它,它是整数的数据类型。因此,我会使用 %f 或 %lf 来打印它。如果您正在处理双重数据类型,上述内容应该会更好

于 2013-08-27T20:11:13.757 回答
1

您不能简单地重新组装 TCP 数据包,因为它的标志没有more bitDon't fragment bitIP 数据包是唯一具有此类标志的数据包,因此您只能使用标志重新组装 IP 数据包:

“不要碎片化”位。当该位被设置时,IP 数据报永远不会被分段,而是在需要分段时将其丢弃。第三位代表“更多片段”位。如果设置了该位,则它表示一个分段的 IP 数据报,其后有更多的分段。如果是 IP 数据报的最后一个片段,则该位不设置,表示这是特定 IP 数据报的最后一个片段。

于 2014-06-02T17:46:00.633 回答