Socket - gaierror

H

half.italian

Hi all,

I'm having trouble with the socket module resolving a hostname. It
seems like this is a system level problem, but I'm not even sure where
to start. I can ping the smtp server by name and IP, but when
smtp.SMTP("theHost") tries to get the hostname, it keeps giving me the
following error:

File "bin/program.py", line 123, in notify
smtp = smtplib.SMTP("theHost")

File "/usr/lib/python2.4/smtplib.py", line 255, in __init__
addr = socket.gethostbyname(socket.gethostname())

gaierror: (-2, 'Name or service not known')

I tried changing to a different smtp server, using an ip instead of a
host name. I could ping both boxes by name oor IP.

any ideas?

~Sean
 
L

Larry Bates

Hi all,

I'm having trouble with the socket module resolving a hostname. It
seems like this is a system level problem, but I'm not even sure where
to start. I can ping the smtp server by name and IP, but when
smtp.SMTP("theHost") tries to get the hostname, it keeps giving me the
following error:

File "bin/program.py", line 123, in notify
smtp = smtplib.SMTP("theHost")

File "/usr/lib/python2.4/smtplib.py", line 255, in __init__
addr = socket.gethostbyname(socket.gethostname())

gaierror: (-2, 'Name or service not known')

I tried changing to a different smtp server, using an ip instead of a
host name. I could ping both boxes by name oor IP.

any ideas?

~Sean
The specific error shown is a DNS resolution problem. Based on the
URL "theHost" smtplib can't resolve to an IP address (which is what
socket.gethostbyname does). You don't say what happened when you changed to ip,
but I suspect it is a different error or some other problem. Maybe a firewall
issue (port 25 not open?), but I'm just guessing.

-Larry
 
H

half.italian

The specific error shown is a DNS resolution problem. Based on the
URL "theHost" smtplib can't resolve to an IP address (which is what
socket.gethostbyname does). You don't say what happened when you changed to ip,
but I suspect it is a different error or some other problem. Maybe a firewall
issue (port 25 not open?), but I'm just guessing.

-Larry

Changing it to IP gives me the same exact error...

File "bin/prgram.py", line 123, in notify
smtp = smtplib.SMTP("XXX.XXX.XXX.XXX")

File "/usr/lib/python2.4/smtplib.py", line 255, in __init__
addr = socket.gethostbyname(socket.gethostname())

gaierror: (-2, 'Name or service not known')

Looks like the smtp port is closed on the client machine...doh Should
have gotten to that!

Thank you.

~Sean
 
H

half.italian

Changing it to IP gives me the same exact error...

File "bin/prgram.py", line 123, in notify
smtp = smtplib.SMTP("XXX.XXX.XXX.XXX")

File "/usr/lib/python2.4/smtplib.py", line 255, in __init__
addr = socket.gethostbyname(socket.gethostname())

gaierror: (-2, 'Name or service not known')

Looks like the smtp port is closed on the client machine...doh Should
have gotten to that!

Thank you.

~Sean

I take it back, that wasn't the solution. I got it to work by
haacking smtplib with a static host instead of the
socket.gethostbyname(socket.gethostname()) call...but if I leave that
in there I might get shot one day. What could cause the shell to be
able to resolve the addresses properly, but not python?
nnsswitch.conf ?

I don't know enough about what's going on in the background. Any
other ideas? Or should I try this on a unix board?

~Sean
 
L

Lawrence D'Oliveiro

In message <[email protected]>,
What could cause the shell to be
able to resolve the addresses properly, but not python?
nnsswitch.conf ?

How did you test the name resolution in the shell--was it with "host"
or "ping"? I would recommend ping, because that would use the same C
runtime gethostbyname call that your Python code is trying to use.
 
D

Douglas Wells

Changing it to IP gives me the same exact error...

File "bin/prgram.py", line 123, in notify
smtp = smtplib.SMTP("XXX.XXX.XXX.XXX")

File "/usr/lib/python2.4/smtplib.py", line 255, in __init__
addr = socket.gethostbyname(socket.gethostname())

gaierror: (-2, 'Name or service not known')

Looks like the smtp port is closed on the client machine...doh Should
have gotten to that!

~Sean

Note that the lookup is of your *local* system name
(socket.gethostname()). I suspect that the name of your client
system (the one running the python script) is not registered in
DNS.

Try ping'ing your own system and see if that resolves in DNS. In
UNIX/Linux you can use the hostname command; in any system you can
write a python script to print the result of socket.gethostname().

- dmw
 
H

half.italian

Note that the lookup is of your *local* system name
(socket.gethostname()). I suspect that the name of your client
system (the one running the python script) is not registered in
DNS.

Try ping'ing your own system and see if that resolves in DNS. In
UNIX/Linux you can use the hostname command; in any system you can
write a python script to print the result of socket.gethostname().

- dmw

I found a solution...but still not sure why that happened.

root@00:17:08:5E:EF:0F:/usr/local/sw/program/bin# hostname
00:17:08:5E:EF:0F
root@00:17:08:5E:EF:0F:/usr/local/sw/program/bin# ping 00:17:08:5E:EF:
0F
ping: unknown host 00:17:08:5E:EF:0F
'00:17:08:5E:EF:0F'

Workaround: pass the 'local_hostname' arg to the smtplib.SMTP() call
with "localhost"

ie smtp.SMTP("some.computer", local_hostname="localhost")

This is just overriding the socket.gethostname() call entirely.

Did a bit of testing with the /etc/hosts file, and even with an entry
to the hostname it can't resolve the ip.
The problem is the name "00:17:08:5E:EF:0F" PS. I didn't choose to
set the hostname that way.

~Sean
 
S

Steve Holden

I take it back, that wasn't the solution. I got it to work by
haacking smtplib with a static host instead of the
socket.gethostbyname(socket.gethostname()) call...but if I leave that
in there I might get shot one day. What could cause the shell to be
able to resolve the addresses properly, but not python?
nnsswitch.conf ?

I don't know enough about what's going on in the background. Any
other ideas? Or should I try this on a unix board?
Well the first thing to do is call socket.gethostname() and see what it
returns, then call socket.gethostbyname() on the result. Once you know
what's failing we might be able to help.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------
 
D

Douglas Wells

I found a solution...but still not sure why that happened.

root@00:17:08:5E:EF:0F:/usr/local/sw/program/bin# hostname
00:17:08:5E:EF:0F
root@00:17:08:5E:EF:0F:/usr/local/sw/program/bin# ping 00:17:08:5E:EF:0F
ping: unknown host 00:17:08:5E:EF:0F

'00:17:08:5E:EF:0F'

Workaround: pass the 'local_hostname' arg to the smtplib.SMTP() call
with "localhost"

ie smtp.SMTP("some.computer", local_hostname="localhost")

This is just overriding the socket.gethostname() call entirely.

Did a bit of testing with the /etc/hosts file, and even with an entry
to the hostname it can't resolve the ip.
The problem is the name "00:17:08:5E:EF:0F" PS. I didn't choose to
set the hostname that way.

~Sean

That would be a reasonable workaround. The process of sending
e-mail via SMTP could need the local host name for at least two
uses: 1) the SMTP initial connection (RFC 2821) requires the
client to identify itself (provide its host name); 2) the mail
headers (RFC 2822) should include a return address, which probably
defaults to using your user name at your client host name.

The hostname of your system (00:17:08:5E:EF:0F) is silly when used
with SMTP. Your system administrator is either ill-informed or is
actively trying to prevent users from using their systems as
servers. It has the form of an IPv6 numeric host address.

Given the pathnames in your command interchange, you have a UNIX,
Linux, or UNIX-like system. According to the Linux and UNIX standards:

- If your system is IPv6-capable, the use of such a name with
gethostbyname invokes "unspecified behavior." First, the function
is not defined to work with such "numeric" identifiers. Second,
it is not guaranteed to work with non-IPv4 names, and probably
can't be registered in pre-i18n DNS data bases.

- Even if your system is not IPv6-capable, such a host name is going
to confuse many other systems that would be IPv6-capable and attempt
to resolve the odd-ball name that your system provides.

- Even if that worked, you're providing an IPv6 name form in
conjunction with an IPv4 protocol (at least when you explicitly
provide the IP address as a dotted-quad).

- dmw
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,163
Latest member
Sasha15427
Top