tags:

views:

2665

answers:

2

This question will expand on: http://stackoverflow.com/questions/68774/best-way-to-open-a-socket-in-python
When opening a socket how can I test to see if it has been established, and that it did not timeout, or generally fail.

Edit: I tried this:

try:
    s.connect((address, '80'))
except:
    alert('failed' + address, 'down')

but the alert function is called even when that connection should have worked.

+4  A: 

It seems that you catch not the exception you wanna catch out there :)

if the s is a socket.socket() object, then the right way to call .connect would be:

import socket
s = socket.socket()
port = 80 # port number is a number, not string
try:
    s.connect((address, port)) 
except Exception, e:
    alert('something\'s wrong with %s:%d. Exception type is %s' % (address, port, `e`))

Always try to see what kind of exception is what you're catching in a try-except loop.

You can check what types of exceptions in a socket module represent what kind of errors (timeout, unable to resolve address, etc) and make separate except statement for each one of them - this way you'll be able to react diffrently for diffrent kind of problems.

kender
This doesn't seem to be working, even still, the alert function is not being called.
Unkwntech
try to move the s.connect out of the try: block. what error will you get?
kender
A: 

You should really post:

  1. The complete source code of your example
  2. The actual result of it, not a summary

Here is my code, which works:

import socket, sys

def alert(msg):
    print >>sys.stderr, msg
    sys.exit(1)

(family, socktype, proto, garbage, address) = \
         socket.getaddrinfo("::1", "http")[0] # Use only the first tuple
s = socket.socket(family, socktype, proto)

try:
    s.connect(address) 
except Exception, e:
    alert("Something's wrong with %s. Exception type is %s" % (address, e))

When the server listens, I get nothing (this is normal), when it doesn't, I get the expected message:

Something's wrong with ('::1', 80, 0, 0). Exception type is (111, 'Connection refused')
bortzmeyer