gpt4 book ai didi

c - 两个结构的 TCP 校验和

转载 作者:行者123 更新时间:2023-11-30 16:35:39 25 4
gpt4 key购买 nike

我正在尝试创建一个为 TCP 生成校验和的函数,但我使用两种 TCP 结构,因为 tcp.h header 中为 Mac OS X 制作的 tcphdr 结构不包含制作数据包所需的所有内容。我的数据包包含 tcphdr 结构和以下结构:

typedef struct tcp_option{
u_int16_t mss_opt:8,
mss_len:8;
u_int16_t mss;
u_int16_t sack_kind:8,
sack_len:8;
u_int16_t win_opt:8,
win_len:8;
u_int32_t win:8,
win_nop:8,
time_opt:8,
time_len:8;
u_int32_t time;
u_int32_t time_echo;
} tcp_option;

那么有没有人有办法制作一个校验和来传递这个结构和 tcphdr 结构。

我的校验和函数适用于 IP 校验和,但不适用于其中有两个结构的 TCP 校验和。这是校验和函数:

unsigned short checksum(const char *buf, unsigned size)
{
unsigned long long sum = 0;
const unsigned long long *b = (unsigned long long *) buf;

unsigned t1, t2;
unsigned short t3, t4;

/* Main loop - 8 bytes at a time */
while (size >= sizeof(unsigned long long))
{
unsigned long long s = *b++;
sum += s;
if (sum < s) sum++;
size -= 8;
}

/* Handle tail less than 8-bytes long */
buf = (const char *) b;
if (size & 4)
{
unsigned s = *(unsigned *)buf;
sum += s;
if (sum < s) sum++;
buf += 4;
}

if (size & 2)
{
unsigned short s = *(unsigned short *) buf;
sum += s;
if (sum < s) sum++;
buf += 2;
}

if (size)
{
unsigned char s = *(unsigned char *) buf;
sum += s;
if (sum < s) sum++;
}

/* Fold down to 16 bits */
t1 = sum;
t2 = sum >> 32;
t1 += t2;
if (t1 < t2) t1++;
t3 = t1;
t4 = t1 >> 16;
t3 += t4;
if (t3 < t4) t3++;

return ~t3;
}

不是我自己做的,是从网上盗来的。

解决方案:我删除了这两个结构并将其组合为一个结构,然后我制作了一个伪 header 结构,我用它来制作校验和!

最佳答案

您的结构在 u_int_32_t 成员之前有奇数个 u_int_16_t 成员,因此为了确保 32 位成员正确对齐,它将有一个隐藏的 16 位成员其中的位 block 您将永远无法通过成员引用进行设置,并且其内容将是未定义的。因此,比较缓冲区中的每个 16 位字将包括比较该 16 位值。如果您不使用某种方法来确保该空间的值始终相同,例如在将值分配给其成员之前使用 memset(0) 结构,那么您将不得不使用不同的方法比较过程(显式比较成员。)

关于c - 两个结构的 TCP 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48810303/

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