根据Flags重新组装tcp数据包

时间:2013-08-27 19:23:19

标签: c# tcp

如何根据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 
}

我唯一要知道的是知道flags的值意味着这是fragemented数据包的最后一部分?

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

查找printf format specifiers%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然后使用电锯通常不那么危险。但是如果你不在乎手中拿着什么以及哪一个指向你试图切割的木头,你的里程可能会有所不同。因此,您应该仔细查看您使用的功能的文档。

供参考:

答案 3 :(得分:2)

指定的格式“%d”定义一个整数 NOT 一个双变量。

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

答案 4 :(得分:1)

可能已经说过,但是由于你将数组变量声明为双数据类型,所以你不能突然使用%d打印它,这是一个整数的数据类型。因此,我会使用%f或%lf来打印它。如果你正在处理双数据类型,前面提到的应该会更好。

答案 5 :(得分:1)

你不能简单地重组TCP数据包,因为它的Flags没有more bitDon't fragment bit IP数据包是唯一一个有这样的标志的数据包,所以你只能这样使用Flags重新组装IP数据包:

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