【问题标题】:Why is my traceroute failing to contact a server partway through running?为什么我的 traceroute 在运行中途无法联系服务器?
【发布时间】:2016-03-08 19:44:17
【问题描述】:

我一直在努力让我的 traceroute 启动并运行,我希望能得到一些帮助。我在 Linux VM 上使用 Python 2.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

它会继续超时,直到达到我的最大跳数。有人有建议吗?

谢谢!

【问题讨论】:

    标签: python python-2.7 sockets network-programming timeout


    【解决方案1】:

    做了一些研究。问题最终是我使用的端口号。编写 traceroute 时,使用端口 33434。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2021-10-18
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多