1

1、32 ビットの整数値が与えられた場合、それがプライベート IPv4 アドレスであるかどうかを正確に判断する方法。

2. 128 ビットの整数値が与えられた場合、それがプライベート IPv6 アドレスかどうかを正確に判断する方法。

さまざまなプラットフォームでの IP アドレスのバイト オーダーを考慮してください。このような一般的な小さな関数を毎回記述すると、エラーが発生しやすくなります。だから、これにはライブラリ関数が必要だと思いますか?

4

2 に答える 2

2

これで始められます。「リンクローカル」アドレス範囲をわざわざ含めることはしませんでしたが、以下のコードを変更することで完了する必要のある演習です。

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;
}
于 2013-01-12T12:11:57.457 に答える