我正在构建一个嵌入式网络设备(基于Linux),需要动态生成守护进程配置文件。因此,我需要在Python代码中进行一些网络地址计算,以便生成配置文件。由于我不是程序员,所以我担心一旦设备开始发货,我的模块将无法按照我希望的方式运行。
以下是我目前的代码,它实际上是从这个网站和Google上找到的碎片组合而成的。
是否有更好的方法来查找网络接口的网络地址和CIDR?将子网掩码转换为二进制字符串并计算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