How can I look up a hostname given an IP address? Furthermore, how can I specify a timeout in case no such reverse DNS entry exists? Trying to keep things as fast as possible. Or is there a better way? Thank you!
            Asked
            
        
        
            Active
            
        
            Viewed 1.3e+01k times
        
    2 Answers
109
            >>> import socket
>>> socket.gethostbyaddr("69.59.196.211")
('stackoverflow.com', ['211.196.59.69.in-addr.arpa'], ['69.59.196.211'])
For implementing the timeout on the function, this stackoverflow thread has answers on that.
        Community
        
- 1
 - 1
 
        ChristopheD
        
- 112,638
 - 29
 - 165
 - 179
 
- 
                    what about something like 'http:/1.0.1.0/blah/blahm.html' ? – Eiyrioü von Kauyf Dec 12 '12 at 16:42
 - 
                    8@Eiyrioü von Kauyf: That was not the question asked (return a hostname when specified an ip address). – ChristopheD Apr 18 '13 at 14:54
 - 
                    it's the same question - however i'm asking do you have a suggested way to normalize that and do socket.gethostbyaddr("1.0.1.0") or the like? It's the same question but the input format is different - gethostbyaddr does not like non normalized input. – Eiyrioü von Kauyf Apr 18 '13 at 17:44
 - 
                    @EiyrioüvonKauyf yes because its excactly what the method is supposed to do: ip to dns conversion... you could use a regex for that like `http(|s)://([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/.*`. there are plenty more out there, which are better or more precisious – reox Nov 18 '13 at 12:35
 - 
                    Does not work for mapped ipv4: ----> 1 socket.gethostbyaddr('::ffff:69.59.196.211') error: Address family not supported by protocol – thule Feb 21 '14 at 12:46
 - 
                    2socket has its own method to set a timeout: https://docs.python.org/2/library/socket.html#socket.socket.settimeout – gdvalderrama Sep 27 '16 at 08:55
 - 
                    ('apps2.ideal-logic.com', [], ['69.59.196.211']) . this is the format of output I get when I above code. The possibility might be the ip has been changed. But I am getting such result for all my domains too like for one of my domain when passed its ip showing something like this `('ip-149-202-166.eu', [], ['149.202.166.163'])` – Tara Prasad Gurung Aug 31 '17 at 04:35
 - 
                    Does this handle ipv6 addresses or only ipv4? – ericOnline Nov 04 '20 at 00:36
 
22
            
            
        What you're trying to accomplish is called Reverse DNS lookup.
socket.gethostbyaddr("IP") 
# => (hostname, alias-list, IP)
http://docs.python.org/library/socket.html?highlight=gethostbyaddr#socket.gethostbyaddr
However, for the timeout part I have read about people running into problems with this. I would check out PyDNS or this solution for more advanced treatment.
        ase
        
- 13,231
 - 4
 - 34
 - 46