1、32 ビットの整数値が与えられた場合、それがプライベート IPv4 アドレスであるかどうかを正確に判断する方法。
2. 128 ビットの整数値が与えられた場合、それがプライベート IPv6 アドレスかどうかを正確に判断する方法。
さまざまなプラットフォームでの IP アドレスのバイト オーダーを考慮してください。このような一般的な小さな関数を毎回記述すると、エラーが発生しやすくなります。だから、これにはライブラリ関数が必要だと思いますか?
1、32 ビットの整数値が与えられた場合、それがプライベート IPv4 アドレスであるかどうかを正確に判断する方法。
2. 128 ビットの整数値が与えられた場合、それがプライベート IPv6 アドレスかどうかを正確に判断する方法。
さまざまなプラットフォームでの IP アドレスのバイト オーダーを考慮してください。このような一般的な小さな関数を毎回記述すると、エラーが発生しやすくなります。だから、これにはライブラリ関数が必要だと思いますか?
これで始められます。「リンクローカル」アドレス範囲をわざわざ含めることはしませんでしたが、以下のコードを変更することで完了する必要のある演習です。
IPV6は少し異なります。また、ほとんどのシステムにはネイティブの128ビットタイプがないため、質問の形式は少し間違っています。IPv6アドレスは通常、sockaddr_in6構造体に埋め込まれた16バイトの配列として含まれています。
この例を完了するために知っておく必要のあることはすべて、このリンクにあります。
// assumes ip is in HOST order. Use ntohl() to convert as approrpriate
bool IsPrivateAddress(uint32_t ip)
{
uint8_t b1, b2, b3, b4;
b1 = (uint8_t)(ip >> 24);
b2 = (uint8_t)((ip >> 16) & 0x0ff);
b3 = (uint8_t)((ip >> 8) & 0x0ff);
b4 = (uint8_t)(ip & 0x0ff);
// 10.x.y.z
if (b1 == 10)
return true;
// 172.16.0.0 - 172.31.255.255
if ((b1 == 172) && (b2 >= 16) && (b2 <= 31))
return true;
// 192.168.0.0 - 192.168.255.255
if ((b1 == 192) && (b2 == 168))
return true;
return false;
}