在Python中测试套接字连接

时间:2008-10-07 06:30:20

标签: python sockets

这个问题将扩展为:Best way to open a socket in Python
打开套接字时,我如何测试它是否已经建立,并且它没有超时,或者通常会失败。

编辑: 我试过这个:

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

但即使连接应该有效,也会调用alert函数。

4 个答案:

答案 0 :(得分:36)

似乎你没有抓住你想要赶上的例外:)

如果ssocket.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语句 - 这样您就可以了能够针对不同类型的问题做出不同的反应。

答案 1 :(得分:8)

您可以使用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!"

答案 2 :(得分:5)

你应该发帖:

  1. 您示例的完整源代码
  2. 实际结果,而不是摘要
  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's wrong with %s. Exception type is %s" % (address, e))
    

    当服务器监听时,我什么也得不到(这是正常的),当它 没有,我得到了预期的信息:

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

答案 3 :(得分:1)

12年后,遇到类似问题的人。

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

不起作用,因为端口“ 80”是字符串。您的端口必须为整数。

try:
    s.connect((address, 80))

这应该有效。 不知道为什么最好的答案都没有看到这个。