这一行代码的目的是计算指针 buf_ip4
,使其指向缓冲区中存放 IPv4 地址的部分。具体来说,它通过跳过 IP4MAPPED_HEADER
的内容,让 buf_ip4
指向原始缓冲区 buf
中的适当位置。
我们一步步来分析这句代码:
char *buf_ip4 = buf + sizeof(IP4MAPPED_HEADER) - 1;
解释:
-
IP4MAPPED_HEADER
是一个字符串常量,它的值是"::FFFF:"
,表示 IPv4 映射的 IPv6 地址前缀。#define IP4MAPPED_HEADER "::FFFF:"
- 它的长度是 8 个字符(7 个字符 + 终止符
\0
)。
-
sizeof(IP4MAPPED_HEADER)
计算了IP4MAPPED_HEADER
所占的字节数,它包含了字符串终止符\0
,所以结果是 8。 -
buf + sizeof(IP4MAPPED_HEADER) - 1
:buf
是传入的字符缓冲区,它最开始会保存完整的 IPv6 地址字符串。sizeof(IP4MAPPED_HEADER)
返回 8,但为了存放 IPv4 地址部分,你并不需要包含字符串终止符\0
,所以减去 1,表示buf_ip4
指向第 7 个字符,也就是:
之后的第一个位置。
-
结果:
buf_ip4
是一个指向buf
中位置的指针,它跳过了"::FFFF:"
这一部分,直接指向缓冲区中的 IPv4 地址存放位置。- 这样做的目的是确保在缓冲区的
buf
中,IPv4 地址部分紧接着"::FFFF:"
之后。
图示:
假设 buf
是一个字符数组,经过 memcpy
复制了 "::FFFF:"
后,buf
的内容可能如下:
|:|:|F|F|F|F|:| | | |...
指针 buf_ip4 指向第 7 个位置的空白区域,准备存放接下来的 IPv4 地址部分:
buf_ip4 --> | | | |...
总结:
这段代码的目的是通过调整指针 buf_ip4
,使它指向 buf
中紧接着 ::FFFF:
后的内存位置,方便存储对应的 IPv4 地址部分。