Тестирование соединения сокетов в Python
Этот вопрос будет расширяться: Лучший способ открыть сокет в Python
При открытии сокета, как я могу проверить, установлено ли оно, и что он не тайм-аут или вообще не работает.
Редактировать:
Я пробовал это:
try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
но функция предупреждения вызывается даже тогда, когда это соединение должно работать.
Ответы
Ответ 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')