Тестирование сокетного соединения в Python - PullRequest
21 голосов
/ 07 октября 2008

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

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

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

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

Ответы [ 3 ]

36 голосов
/ 07 октября 2008

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

если 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's wrong with %s:%d. Exception is %s" % (address, port, e))
finally:
    s.close()

Всегда старайтесь увидеть, какое исключение вы ловите в цикле try-Кроме.

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

8 голосов
/ 12 декабря 2013

Вы можете использовать функцию 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's ok!"
5 голосов
/ 07 октября 2008

Вы действительно должны написать:

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

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

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))

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

Something's wrong with ('::1', 80, 0, 0). Exception type is (111, 'Connection refused')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...