我已經使用ASIO文檔中提供的ICMP example來創建一個簡單的ping實用程序。但是,該示例僅涵蓋IPv4,我很難使其適用於IPv6。使用Asio Boost的ICMPv6校驗和計算問題
升級ICMP頭類以支持IPv6需要稍作更改--ICMP和ICMPv6頭文件的唯一區別是ICMP類型的不同枚舉。但是,我在計算需要併入ICMPv6頭中的校驗和時遇到了問題。
對於IPv4,校驗和基於ICMP頭和淨荷。但是,對於IPv6,校驗和應在ICMPv6標頭和有效負載之前包含IPv6僞標頭。 ICMPv6校驗和功能需要知道IPv6頭中的源地址和目的地址。但是,我們無法控制進入IPv6標頭的內容。在Asio-Boost中如何做到這一點?
僅供參考,請參閱下面的IPv4校驗和計算功能。
void compute_checksum(icmp_header& header, Iterator body_begin, Iterator body_end)
{
unsigned int sum = (header.type() << 8) + header.code()
+ header.identifier() + header.sequence_number();
Iterator body_iter = body_begin;
while (body_iter != body_end)
{
sum += (static_cast<unsigned char>(*body_iter++) << 8);
if (body_iter != body_end)
sum += static_cast<unsigned char>(*body_iter++);
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
header.checksum(static_cast<unsigned short>(~sum));
}
[編輯]
什麼後果,如果校驗和計算不正確?如果回顯請求的校驗和無效,目標主機是否會發送回應回覆?