如何根据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数据包的最后一部分?
答案 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 bit
或Don't fragment bit
IP数据包是唯一一个有这样的标志的数据包,所以你只能这样使用Flags重新组装IP数据包:
'不要碎片'位。设置此位后,IP数据报永远不会被分段,而是在出现片段要求时将其丢弃。第三位代表'更多片段'位。如果设置此位,则它表示片段化的IP数据报,其后面有更多片段。如果是IP数据报的最后一个片段,则不会设置此位,表示这是特定IP数据报的最后一个片段。