1

2つのIPv6アドレスとそれらのマスクを比較して、それらが同じであるかどうかを確認する必要があります。どちらも「xxxx:xxxx:xxxx:xxxx/xx」などの文字列です。memcmpを使用してビットごとに比較しますが、xxxx:xxxx:0000:xxxx / xxとxxxx:xxxxx :: xxxxx / xxは技術的に同じアドレスであるため、trueの場合はfalseが返される場合があります。

アドレスとマスクのサブストリングを作成したくないのですが、2つのIPv6アドレスを比較する関数がある場合は作成します。助言がありますか?:)

4

4 に答える 4

5

を使用して両方のアドレスをバイナリ形式に変換してから、バイナリ形式をinet_pton比較する必要があります(これは、比較できる16バイトのデータですmemcmp)。

マスクされたアドレスを比較する必要がある場合は、もう少し作業を行う必要があります。inet_ptonプレフィックス長( "/ something")は解析されないため、次のことを行う必要があります。

  1. スラッシュを探す
  2. スラッシュの前の部分をに渡しますinet_pton
  3. スラッシュの後の整数をプレーンなolで解析します。atoi
  4. アドレスのバイナリ形式の最後にある128からそのビット数を引いたものを手動でゼロにします

...それらを比較する前に各アドレスで。

于 2012-07-31T00:40:07.070 に答える
1

いつものように、車輪の再発明はしないでください。優れたlibcidrライブラリは、必要なことなどを実行します。 http://www.over-yonder.net/~fullermd/projects/libcidr

于 2013-06-15T21:21:36.450 に答える
0

サブストリングは抽出が非常に簡単なので、サブストリングを使用することをお勧めします。次に、文字列のequals()関数をオーバーロードして、「0000」と「」、および遭遇する可能性のあるその他のコーナーケースを比較するときにtrueを返すことができます。

于 2012-07-31T00:55:10.907 に答える
0

同じ形式に変換する関数を介して両方のアドレスを渡すこともできます。その後、それらを文字列として比較できます。

関数の例:

string Ip6(const string& data) {
    struct in6_addr ip6;
    if (inet_pton(AF_INET6, data.c_str(), &ip6) != 1)
        throw str::runtime_error("bad ivp6 address");

    char buf[INET6_ADDRSTRLEN];
    return inet_ntop(AF_INET6, &ip6, buf, sizeof(buf));
}
于 2012-07-31T01:02:11.320 に答える