这个问题将扩展至:Python中打开套接字的最佳方法
在打开套接字时,如何测试以查看是否已建立连接,并且它没有超时或通常失败。
编辑:
我尝试了这个:
try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
但是即使连接应该正常工作,警报函数也会被调用。
这个问题将扩展至: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循环中,尽量确切地了解所捕获的异常类型。
您可以检查socket模块中哪些异常类型表示什么样的错误(超时,无法解析地址等),并为每种类型的错误编写单独的except
语句 - 这样您就可以根据不同的问题做出不同的反应。
s
作为OP在问题中使用了这个变量名 :) - kenders = 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')
(family, socktype, proto, garbage, address) = \
赋值的位是如何工作的?顺便说一句,回答很扎实。 - Nathan Basanesegetaddrinfo
的所有结果。但是,应该使用协议ID调用它以跳过UDP和类似的条目:socket.getaddrinfo(address, port, 0, 0, socket.IPPROTO_TCP)
。 - Mikhail T.try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
无法工作是因为端口“80”是字符串。您的端口需要是整数。
try:
s.connect((address, 80))
这应该可以正常工作。 不确定为什么即使是最佳答案也没有看到这一点。
上下文管理器
比使用Try
和Except
更好吗? - rustyMagnet