如何从数据包中提取IPv4地址?

时间:2014-02-26 20:45:26

标签: c# ip packet

我有byte[]代表IPv4 packet

byte[] arr = { 0, 48, 136, 21, 69, 131, 0, 24, 231, 253, 174, 161, 8, 0, 69, 0, 0, 52, 2, 31, 64, 0, 128, 6, 230, 22, 212, 25, 99, 74, 202, 177, 16, 121, 194, 156, 0, 119, 160, 128, 75, 200, 249, 141, 210, 78, 80, 24, 64, 252, 130, 182, 0, 0, 65, 82, 84, 73, 67, 76, 69, 32, 51, 52, 13, 10 };

我想计算IPV4 address

1 个答案:

答案 0 :(得分:3)

这是一个用于检查字节数组的简单解析器:

void Main()
{
    byte[] arr = { 0, 48, 136, 21, 69, 131, 0, 24, 231, 253, 174, 161, 8, 0, 69, 0, 0, 52, 2, 31, 64, 0, 128, 6, 230, 22, 212, 25, 99, 74, 202, 177, 16, 121, 194, 156, 0, 119, 160, 128, 75, 200, 249, 141, 210, 78, 80, 24, 64, 252, 130, 182, 0, 0, 65, 82, 84, 73, 67, 76, 69, 32, 51, 52, 13, 10 };
    var stream = new MemoryStream(arr, 0, arr.Length);
    var reader = new BinaryReader(stream);

    Print("Version and header length", reader.ReadByte());
    Print("Diff services", reader.ReadByte());

    Print("Total length", IPAddress.NetworkToHostOrder(reader.ReadInt16())); 
    Print("ID", IPAddress.NetworkToHostOrder(reader.ReadInt16()));
    Print("Flags and offset", IPAddress.NetworkToHostOrder(reader.ReadInt16()));

    Print("TTL", reader.ReadByte());
    Print("Protocol", reader.ReadByte());
    Print("Checksum", reader.ReadInt16());

    Print("Source IP", new IPAddress((int) reader.ReadInt32()));
    Print("Destination IP", new IPAddress((int) reader.ReadInt32()));
}

这会产生此输出:

Version and header length = 0
Diff services = 48
Total length = -30699
ID = 17795
Flags and offset = 24
TTL = 231
Protocol = 253
Checksum = -24146
Source IP = 8.0.69.0
Destination IP = 0.52.2.31

这看起来不太正确(负长度/校验和?+协议应返回' 6'对于TCP或' 8'对于UDP)。您可能希望先验证数据是否正确。

我用a tiny project of mine中的代码编写了这些代码,可能会帮助您解决未来的问题。绝对要看wikipedia上的数据包布局,你也需要DNS / UDP。