Подтвердить что ты не робот

Тестирование соединения сокетов в Python

Этот вопрос будет расширяться: Лучший способ открыть сокет в Python
При открытии сокета, как я могу проверить, установлено ли оно, и что он не тайм-аут или вообще не работает.

Редактировать: Я пробовал это:

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

но функция предупреждения вызывается даже тогда, когда это соединение должно работать.

4b9b3361

Ответ 1

Кажется, вы не поймали не то исключение, которое вы хотите поймать там:)

если s является объектом socket.socket(), тогда правильный способ вызова .connect:

import socket
s = socket.socket()
address = '127.0.0.1'
port = 80  # port number is a number, not string
try:
    s.connect((address, port)) 
    # originally, it was 
    # except Exception, e: 
    # but this syntax is not supported anymore. 
except Exception as e: 
    print("something wrong with %s:%d. Exception is %s" % (address, port, e))
finally:
    s.close()

Всегда пытайтесь понять, какое исключение - это то, что вы ловите в цикле try-except.

Вы можете проверить, какие типы исключений в модуле сокета представляют какие ошибки (таймаут, неспособность разрешить адрес и т.д.) и сделать отдельный оператор except для каждого из них - таким образом вы сможете реагируют по-разному на разные проблемы.

Ответ 2

Вы можете использовать функцию connect_ex. Это не исключение. Вместо этого возвращается целочисленное значение типа C (называемое errno в C):

s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((host, port))
s.close()
if result:
    print "problem with socket!"
else:
    print "everything it ok!"

Ответ 3

Вы действительно должны публиковать сообщения:

  • Полный исходный код вашего примера
  • Результат фактический, а не сводка

Вот мой код, который работает:

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 wrong with %s. Exception type is %s" % (address, e))

Когда сервер слушает, я ничего не получаю (это нормально), когда он нет, я получаю ожидаемое сообщение:

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