为什么我的traceroute在运行过程中未能与服务器联系?

2024-04-27 04:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力让我的traceroute启动和运行,我希望得到一些帮助。我在Linux虚拟机上用python2.7运行这个程序。下面是我的源代码(请忽略第一行的间距;我很难弄清楚SO的代码格式化工具,但在本地副本中缩进是正确的。)

def main(dest_name):

dest_addr = socket.gethostbyname(dest_name)
# Define UDP and ICMP
udp = socket.getprotobyname('udp')
icmp = socket.getprotobyname('icmp')
timer = 1
port = 54321
maxHops = 40
totalRTT = 0

while True:
    # Create sender and receiver. Sender uses UDP, receiver uses IDMP
    sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)

    # Assign TTL to sender, increment TTL
    sender.setsockopt(socket.SOL_IP, socket.IP_TTL, timer)

    receiver = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    receiver.settimeout(15.0)

    # Bind socket and send message from sender to receiver
    receiver.bind(("", port))
    sender.sendto("", (dest_name, port))

    # Ensures that not receiving won't stall the program
    # receiver.setblocking(0)

    addr = None
    name = None
    count = 0

    try:
        # Keep track of RTT
        startTime = time.time()
        # Reads an array of 512-byte sized blocks from sender into addr
        (_,addr) = receiver.recvfrom(512)
        addr = addr[0]
        # Try to get site name
        try:
            name = socket.gethostbyaddr(addr)[0]
        except socket.error:
            name = addr
    # Process socket errors
    except socket.error as exc:
        pass
    # Close both sockets
    finally:
        sender.close()
        receiver.close()
        endTime = time.time()
        # Record RTT, total RTT, convert to ms
        RTT = (endTime - startTime) * 1000
        totalRTT += RTT

    if addr is not None:
        host = "%s (%s)" % (name, addr)
    else:
        host = "*"
    print("%d\t%s" % (timer, host))
    print(" %f" % RTT + " ms")

    timer += 1
    if addr == dest_addr or timer > maxHops:
        print("Total RTT: %f\n" % totalRTT)
        print("Hop count: %d\n" % timer)
        break

if __name__ == "__main__":
    main('www.google.com')

我的输出如下所示:

1       129.22.144.2 (129.22.144.2)
 3.091097 ms
2       10.2.0.98 (10.2.0.98)
 4.683971 ms
3       10.2.3.169 (10.2.3.169)
 6.258011 ms
4       *
 15015.315056 ms
5       *
 15015.240908 ms

它继续超时,直到达到我的最大跃点计数。有人有什么建议吗?你知道吗

谢谢!你知道吗


Tags: andtonamertttimemainsocketsender