[英]Testing socket connection in Python
这个问题将扩展到: Best way to open a socket in Python
打开套接字时,我如何测试以查看它是否已建立,并且它没有超时,或者通常会失败。
编辑:我试过这个:
try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
但是即使该连接应该正常工作,也会调用警报功能。
似乎你捕捉到的不是你想要捕捉的异常:)
如果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 循环中捕获的异常类型。
您可以检查套接字模块中哪些类型的异常代表哪些类型的错误(超时、无法解析地址等)并为每个异常创建单独的except
语句 - 这样您就可以对不同类型的异常做出不同的反应的问题。
您可以使用函数connect_ex 。 它不会抛出异常。 取而代之的是,返回一个 C 风格的整数值(在 C 中称为errno ):
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!"
你真的应该发帖:
这是我的代码,它有效:
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')
12 年后,对于任何有类似问题的人。
try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
不起作用,因为端口 '80' 是一个字符串。 您的端口需要是 int。
try:
s.connect((address, 80))
这应该有效。 不知道为什么即使是最好的答案也没有看到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.