1

IPv4 アドレス (針) と IPv4 アドレスの並べ替えられていない配列 (干し草の山) が与えられた場合、与えられた干し草の山内のどの単一アドレスが針に (ネットワーク的に、地理的にではなく) 最も近いかをプログラムで特定するにはどうすればよいでしょうか?

すべてのアドレスのネットマスクにアクセスできるわけではないため、ソリューションはネットマスクと traceroute のようなオプションを無視する必要があります。

プライベート、予約済み、ブロードキャスト、LAN、WAN など、あらゆる種類のアドレスが使用されます。

理論、疑似コード、python、php、または perl の形でのヘルプは大歓迎です。

2 つの IP アドレス間で IP アドレス リストを取得するという質問は、おおむね似ていますが、かなりカットされています。

4

3 に答える 3

1

私はあなたが何を求めているのかまだよくわかりませんが、あなたのコメントに基づいています

@PeterGibsonは、私が意味した最も近いもので、 192.168.1.101 は 172.30.130.66 よりも 192.168.56.1 に近いです。また、192.168.1.254 は、192.168.2.1 よりも 192.168.1.240 に近いです。

距離関数については、次の Python コードを試すことができます。

import socket
def dist(a, b):
    def to_num(addr):
        # parse the address string into integer quads
        quads = map(ord, socket.inet_aton(addr))
        # spread the quads out 
        return reduce(lambda x,y: x * 0x10000 + y, quads)
    return abs(to_num(a) - to_num(b))

返される数値はかなり恣意的ですが、基本的なニーズには十分です。ただし、ブロードキャストアドレスなどで何をすべきかはまだわかりません。

いくつかの例:

>>> dist('192.168.1.254', '192.168.1.240')
14L
>>> dist('192.168.1.254', '192.168.2.1')
65283L
>>> dist('192.168.1.101', '192.168.56.1')
3604380L
>>> dist('192.168.1.101', '172.30.130.66')
5630092231245859L
于 2013-07-17T13:12:32.037 に答える
0

予約済みの IP アドレス ( http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses )を考慮して、アレイをグループに分割することから始めます。次に、それらを地域ごとに分けます。おそらく、いくつかのツリー構造で十分でしょう。ルート ノードはトップ レベルの領域であり、リーフを閉じると、より小さな領域になります。

于 2013-07-17T12:02:11.917 に答える