Python socket.recv返回损坏的地址

时间:2018-01-23 01:36:30

标签: python python-3.x sockets ipv6

在python 3的“简单”ping实用程序中,我突然在重构后遇到了这个奇怪的错误。我设法将问题追溯到套接字recv函数返回的损坏地址。这或多或少是我可以制作此代码的最小值,这意味着发送ICMPv6回应请求。

import struct
from myPingModule import IPv6_checksum as check

def doit():
    sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, proto=58)
    sock.settimeout(7)

    raddr = socket.inet_pton(socket.AF_INET6, "2607:f8b0:400f:801::200e")
    laddr = socket.inet_pton(socket.AF_INET6, sock.getsockname()[0])

    header = struct.pack("!BBHHH", 0x80, 0,0,0,0)
    checksum = check(header, laddr, raddr)
    header = struct.pack("!BBHHH", 0x80, 0, checksum, 0,0)

    sock.sendto(header+bytes(41), ("2607:f8b0:400f:801::200e", 1)) #icmp has no notion of port numbers

    pkt, addr = sock.recvfrom(65536)

    print(pkt)
    print(addr)

    sock.close()

现在,当我运行此函数时,我得到以下输出:

b"\x86\x00;\x86@\x00\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x06\xf6\xeb\\\xc0\x05\x01\x00\x00\x00\x00\x05\xdc\x03\x04@\xc0\x00'\x8d\x00\x00\t:\x80\x00\x00\x00\x00 \x01\x05X\x14\x18\x00I\x00\x00\x00\x00\x00\x00\x00\x00"
('fe80::206:f6ff:feeb:5cc0%en0', 0, 0, 12)

所以嵌套在b':\x80\x00\x00\x00\x00,这是我的标头,前面是icmpv6协议号(b':' == 58),这通常会让我觉得我发送的数据包有问题。但是,IPv6_checksum函数在重构期间从工作状态没有变化,我找不到任何有效的icmpv6类型/代码组合,这些组合在接收到的数据包中是有意义的。

nslookup确认fe80::206:f6ff:feeb:5cc0%en0没有记录,ping6丢失它发送到该地址的所有数据包。而且根据格式显然无效。

发生什么事了?这是什么地址?当我向2607:f8b0:400f:801::200e(即google.com)发送消息时,它始终是响应的地址,因此它不仅仅是一个侥幸。如果我的数据包格式错误,为什么响应似乎没有表明?

更新

今天,在我没有改变任何内容并且没有编写任何新代码之后,这个问题奇迹般地消失了。我只能猜测这是与我的特定机器或路由器相关的某种奇怪的临时网络状况。我仍然不明白为什么会发生这种情况或者反应意味着什么,所以我将把这个问题留给后人。

0 个答案:

没有答案