472,783 Members | 992 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,783 software developers and data experts.

Getting external IP address

I have a PC behind a firewall, and I'm trying to programmatically
determine the IP address visible from outside the firewall.

If I do this:
>>import socket
socket.gethostbyname(socket.gethostname())
'127.0.0.1'
>>socket.gethostbyname_ex(socket.gethostname())
('localhost.localdomain', ['localhost'], ['127.0.0.1'])

I get my internal IP address, which is not what I want.

Other tricks, like parsing the output of os.system('/sbin/ifconfig eth0')
also give me my internal IP address.

I found this post on comp.lang.python a few years ago:

http://mail.python.org/pipermail/pyt...ch/192495.html

which seems like it _should_ do what I want, but it doesn't: I get an
exception.
>>from httplib import HTTPConnection
from xml.dom.ext.reader.Sax import FromXmlStream
conn = HTTPConnection('xml.showmyip.com')
conn.request('GET', '/')
doc = FromXmlStream(conn.getresponse())
print doc.getElementsByTagName('ip')[0].firstChild.data
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/UserList.py", line 28, in __getitem__
def __getitem__(self, i): return self.data[i]
IndexError: list index out of range
>>conn.close()
I don't know how to fix it so that it works.

Can anyone help me fix that code snippet, or suggest another (better) way
to get the externally visible IP address?
--
Steven D'Aprano

Mar 5 '07 #1
8 4119
Steven D'Aprano <st***@REMOVEME.cybersource.com.auwrote:
>
>>>from httplib import HTTPConnection
from xml.dom.ext.reader.Sax import FromXmlStream
conn = HTTPConnection('xml.showmyip.com')
conn.request('GET', '/')
doc = FromXmlStream(conn.getresponse())
print doc.getElementsByTagName('ip')[0].firstChild.data
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/UserList.py", line 28, in __getitem__
def __getitem__(self, i): return self.data[i]
IndexError: list index out of range
>>>conn.close()

I don't know how to fix it so that it works.

Can anyone help me fix that code snippet, or suggest another (better)
way
to get the externally visible IP address?
Try running it interactively and looking at the data you receive:
>>conn = HTTPConnection('xml.showmyip.com')
conn.request('GET', '/')
>>resp = conn.getresponse()
print resp
<httplib.HTTPResponse instance at 0x00C58350>
>>data = resp.read()
print data
<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="http://www.showmyip.com/xml/">here</a>.
</h2>

</body></html>
If you try connecting to 'www.showmyip.com' and requesting '/xml/' it
should work.
Mar 5 '07 #2
Duncan Booth <du**********@invalid.invalidwrites:
If you try connecting to 'www.showmyip.com' and requesting '/xml/' it
should work.
If the firewall is really obnoxious, it can bounce consecutive queries
around between multiple originating IP addresses. That is uncommon
but it's been done from time to time.
Mar 5 '07 #3
Paul Rubin <http://ph****@NOSPAM.invalidwrote:
Duncan Booth <du**********@invalid.invalidwrites:
>If you try connecting to 'www.showmyip.com' and requesting '/xml/' it
should work.

If the firewall is really obnoxious, it can bounce consecutive queries
around between multiple originating IP addresses. That is uncommon
but it's been done from time to time.
Yes, each connection through the firewall needs to have a unique
originating ip and port number. If there are too many machines inside the
firewall then you may need to allocate multiple ip addresses on the
outside. I would hope that in general a single internal IP should map to
one external IP at a time (otherwise you would have problems with ip based
session persistence connecting to load balanced systems), but you might
expect to bounce round different IPs after periods of inactivity.

Also you could have multiple levels of NAT in which case the question
becomes whether Steven wants the IP as seen from outside the immediate
firewall or outside the final one. Maybe he should be using IPv6 to avoid
all this?
Mar 5 '07 #4
On Mon, 05 Mar 2007 09:02:44 +0000, Duncan Booth wrote:
Try running it interactively and looking at the data you receive:
>>>conn = HTTPConnection('xml.showmyip.com')
conn.request('GET', '/')
>>>resp = conn.getresponse()
print resp
<httplib.HTTPResponse instance at 0x00C58350>
>>>data = resp.read()
print data
<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="http://www.showmyip.com/xml/">here</a>.
</h2>

</body></html>
Ah! That's the clue I needed -- thanks.
If you try connecting to 'www.showmyip.com' and requesting '/xml/' it
should work.
Thank you muchly! That seems to do the trick.
--
Steven.

Mar 6 '07 #5
Steven D'Aprano <st***@REMOVEME.cybersource.com.auwrote:
>I have a PC behind a firewall, and I'm trying to programmatically
determine the IP address visible from outside the firewall.
[ ... ]
Can anyone help me fix that code snippet, or suggest another (better) way
to get the externally visible IP address?
Depending on your circumstances, it may be possible to just ask the
firewall. You'll probably need some kind of administrator login, and
may well have to parse HTML if it's only got a web interface, but it
does mean that you don't have to connect to anything in the outside
world.

--
\S -- si***@chiark.greenend.org.uk -- http://www.chaos.org.uk/~sion/
___ | "Frankly I have no feelings towards penguins one way or the other"
\X/ | -- Arthur C. Clarke
her nu becomež se bera eadward ofdun hlęddre heafdes bęce bump bump bump
Mar 6 '07 #6
I have a PC behind a firewall, and I'm trying to programmatically
determine the IP address visible from outside the firewall.
....
Steven ....

Following is another alternative that might at least
be worth consideration ....

I use the lynx command shown as a command-line alias
under Debian linux ....
>>>
import os

pipe_in = os.popen( 'lynx --dump http://checkip.dyndns.org' )

ip_addr = pipe_in.readlines()

for this in ip_addr :
.... print this
....
Current IP Address: 65.39.92.38
--
Stanley C. Kitching
Human Being
Phoenix, Arizona
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Mar 6 '07 #7
The above suggestions seem nice, but I find this one easier:

import urllib2
ext_ip = urllib2.urlopen('http://whatismyip.org/').read()
print ext_ip

The nice thing about the above code is that http://whatismyip.org/
only contains exactly what you want (the ip, nothing more, nothing
less), so no parsing is necessary

Best,
Sergio

On 3/6/07, Cousin Stanley <co***********@hotmail.comwrote:
>
I have a PC behind a firewall, and I'm trying to programmatically
determine the IP address visible from outside the firewall.
....

Steven ....

Following is another alternative that might at least
be worth consideration ....

I use the lynx command shown as a command-line alias
under Debian linux ....
>>
import os

pipe_in = os.popen( 'lynx --dump http://checkip.dyndns.org' )

ip_addr = pipe_in.readlines()

for this in ip_addr :
... print this
...
Current IP Address: 65.39.92.38
--
Stanley C. Kitching
Human Being
Phoenix, Arizona
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
--
http://mail.python.org/mailman/listinfo/python-list
Mar 6 '07 #8
On Tue, 06 Mar 2007 14:40:37 -0500, Sergio Correia wrote:
The above suggestions seem nice, but I find this one easier:
[snip]
Thanks to everybody who replied, that's great.
--
Steven.

Mar 6 '07 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: N. Graves | last post by:
I'm planning to develop a process to import data from an external flat file to a new table automatically. As usual I'm having a hard time getting started on the solution because of the Access's...
1
by: | last post by:
I'm trying to get (or set) the focus on an external window but to no avail. I've imported the "GetActiveWindow" and "GetFocus" from the user32.dll but those 2 functions seem to only work for windows...
4
by: Macca | last post by:
Hi, I am using an asynchronous socket server to allow comms between multiple clients and my server. I know how to obtain the IPAddress of the client (network device) as shown below :- string...
4
by: iwdu15 | last post by:
Hi, im using this code to get a computers IPAddress Net.Dns.GetHostEntry(Net.Dns.GetHostName()).AddressList(0) but that only gets the Lan IPAddress....how can i get the internet IP address? --...
1
by: rahulbsbs | last post by:
Sir how can i get the ip address of the remote system by writting a java code,ie i want to get ip address of the remote system that is connected to my server computer ,the ip address must be...
0
kaleeswaran
by: kaleeswaran | last post by:
hi! currently i am doing registration form... i like to getting an ip address from the respective system i mean where the user using my application form, the respective system ip address...
0
kaleeswaran
by: kaleeswaran | last post by:
hi!!! i was getting ip address of my local machine in my network using jsp. can i get all of my local machine address which is connected in the network...? if so give me some idea about...
5
by: Gangreen | last post by:
I have a server , and i want to get the external ip of the clients who connect to me. How can I do this? thx (I do not want to use whatismyip's automation page)
0
by: Rina0 | last post by:
Cybersecurity engineering is a specialized field that focuses on the design, development, and implementation of systems, processes, and technologies that protect against cyber threats and...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.