gpt4 book ai didi

用C计算IP校验和

转载 作者:行者123 更新时间:2023-11-30 16:32:03 24 4
gpt4 key购买 nike

我查看了RFC 1071有关计算 IP 校验和的一些信息。对于我正在制作的应用程序,我需要计算 20 字节 IP header 的 IP 校验和(无选项)。我的代码如下:

uint16_t calculate_ip_chksum(IP *ip)
{
uint16_t *buf = (uint16_t *) ip;
uint32_t sum = 0;
uint16_t checksum = 0;

int counter = (ip->version & 0xF) * 4;
while (counter > 1)
{
sum += *buf++;
counter -= 2;
}

if (counter == 1)
sum += * (uint8_t *) buf;

while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
checksum = ~sum;
return checksum;
}

我定义了一个 IP header ,如下所示:

typedef struct ip_h
{
uint8_t version;
uint8_t tos;
uint16_t tot_len;
uint16_t id;
uint16_t frag_off;
uint8_t ttl;
uint8_t proto;
uint16_t chksum;
uint32_t src;
uint32_t dst;

} IP;

我了解如何计算校验和的数学原理,但我不明白为什么我的代码(与 RFC 几乎完全相同)不起作用。

最佳答案

您可以从 ip->version 而不是 tot_len 派生计数器。

 int counter = (ip->version & 0xF) * 4;

我假设您需要缓冲区中的总字节数作为校验和。

关于用C计算IP校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50321292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com