Python 路由跟踪不起作用

1 投票
1 回答
1026 浏览
提问于 2025-04-18 09:11

我找到一个用Python写的Traceroute项目,但它不能正常工作。这个项目是:

import socket
import sys

class TraceRoute(object):

    BADDR = "0.0.0.0" # default bind address - (all IPs)
    PORT = 33434 # default port
    ICMP = socket.getprotobyname('icmp')
    UDP = socket.getprotobyname('udp')

    destination = ""
    ttl = 0 # increase ttl by one each time. 

    # sockets
    reciever = None
    sender = None

    # finished?
    finished = False

    def __init__(self, addr):
        self.destination = socket.gethostbyname(addr)

        self.reciever = socket.socket(socket.AF_INET, socket.SOCK_RAW, self.ICMP)
        self.sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, self.UDP)

        # bind to reciever so we can listen for replies
        self.reciever.bind(('', self.PORT))

    def next_server(self):
        """ Connects to next server 1 hop away from current server (i.e. server[ttl + 1]) """
        if self.finished:
            # we have nothing to do, just return
            return

        # first job increment the ttl on the socket
        self.ttl += 1
        self.sender.setsockopt(socket.SOL_IP, socket.IP_TTL, self.ttl)

        self.sender.sendto("", (self.destination, self.PORT))

        current_server = self.reciever.recvfrom(512)[1][0] # get 512 bytes from the reciever
        print current_server
        self.display(current_server)

        if current_server == self.destination:
            self.finished = True

    def display(self, address):
        """ Gets the hostname (if we can) and displays """
        try:
            name = socket.gethostbyaddr(address)[0]
            print "%s) %s (%s)" % (self.ttl, name, address)
        except socket.error:
            # we couldn't - we'll just tell them the IP address
            print "%s) %s" % (self.ttl, address)

    def __del__(self):
        """ close our sockets """
        try:
            self.reciever.close()
        except socket.error:
            # already closed
            pass

        try:
            self.sender.close()
        except socket.error:
            # already closed
            pass

if __name__ == "__main__":
    # lets get the address from the commandline args
    if len(sys.argv) <= 1:
        # nothing been specified
        print "You need to give an address"
        print "%s <server>" % sys.argv[0]
        sys.exit() # we can't do anything.

    tracert = TraceRoute(sys.argv[1])
    while not tracert.finished:
        tracert.next_server()

我运行这个项目时,它在这一行卡住了:

current_server = self.reciever.recvfrom(512)[1][0]

我用Wireshark查看了一下,发现我收到了ICMP的响应,但我的Python项目不知道怎么抓住这个响应,所以它无法继续执行,停在那一行。

有人能帮帮我吗?

1 个回答

0

我现在正在Windows上写一个traceroute项目,遇到了和你一样的问题,socket.recvfrom在我的电脑上什么都收不到,但在其他电脑上却没问题。

我发现其实是Windows Defender一直在阻止回复消息。关掉Windows Defender后,我开始收到了那些被阻挡的消息。希望这对你有帮助(虽然可能有点晚了)。

撰写回答