该问谁的 MAC

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:to_int 把点分十进制变成 32 位整数,to_str 变回去,mask(前缀长度) 给出掩码的整数——高位连续的 1,低位 0。)

(这一节还多了四个函数:network 网络地址、broadcast 广播地址、same_net 判同网段、hosts 可用主机数。)

贯穿的网:办公室 192.168.10.0/24——本机 .5、打印机 .77、网关 .1;隔壁 192.168.11.0/24 里有 .5;机房 10.0.0.0/8

arp_target 决定该解析谁的 MAC:同段就是目标本身,不同段就是网关。看四个目标:

def to_int(ip):
    a, b, c, d = [int(x) for x in ip.split(".")]
    return (a << 24) | (b << 16) | (c << 8) | d


def to_str(n):
    return ".".join(str((n >> s) & 255) for s in (24, 16, 8, 0))


def mask(prefix):
    return (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF


def network(ip, prefix):
    return to_str(to_int(ip) & mask(prefix))


def broadcast(ip, prefix):
    return to_str((to_int(ip) & mask(prefix)) | (~mask(prefix) & 0xFFFFFFFF))


def same_net(a, b, prefix):
    return to_int(a) & mask(prefix) == to_int(b) & mask(prefix)


def hosts(prefix):
    return 2 ** (32 - prefix) - 2

CACHE = {"192.168.10.77": "aa:11", "192.168.10.1": "aa:01"}
GW = "192.168.10.1"


def arp_target(me, prefix, target):
    return target if same_net(me, target, prefix) else GW

me = "192.168.10.5"
print(",".join(arp_target(me, 24, t) for t in ("192.168.10.77", "192.168.11.5", "10.0.0.9", "192.168.10.1")))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论