私は組み込みのネットワークアプライアンス(Linuxベース)の構築に取り組んでおり、デーモンconfファイルを動的に構築する必要性を抱いています。そのため、私は、confファイルを構築するpythonコードでネットワークアドレス計算を行う必要があります。私はプログラマーではないので、アプライアンスが出荷を開始すると期待していたように、機能しなくなるモジュールを書いたことに恐れています。Pythonネットワーク/ cidr計算
以下は、これまで私がこのサイトとGoogleで見つけたものと実際に結びついたものです。
ネットワークインターフェイスのネットワークアドレスとcidrを見つけるより良い方法はありますか?ネットマスクをbin strに変換し、1を数えていくのはかなり控えめです。
import socket
import fcntl
import struct
SIOCGIFNETMASK = 0x891b
SIOCGIFADDR = 0x8915
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def _GetIfaceMask(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', iface))[20:24])[0]
def _GetIfaceAddr(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24])[0]
def GetIfaceNet(iface):
net_addr = _GetIfaceAddr(iface) & _GetIfaceMask(iface)
return socket.inet_ntoa(struct.pack('L', net_addr))
def GetIfaceCidr(iface):
bin_str = bin(_GetIfaceMask(iface))[2:]
cidr = 0
for c in bin_str:
if c == '1': cidr += 1
return cidr
入力していただきありがとうございます。これは本当にやや失われています。これがこのタイプのフィードバックの場所でない場合は、私にお知らせください。
あなたは 'netaddr'または' ipaddr'モジュールを試してみましたか? – jfs
ああ!私は誰かがこれを既に済まされているに違いないと考えました - ありがとうございます@セバスチャン – tMC