代码之家  ›  专栏  ›  技术社区  ›  UnkwnTech

在python中测试套接字连接

  •  21
  • UnkwnTech  · 技术社区  · 16 年前

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

    编辑: 我试过这个:

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

    但即使连接正常,也会调用alert函数。

    3 回复  |  直到 8 年前
        1
  •  36
  •   hochl Michael Aaron Safyan    8 年前

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

    如果 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 对每一个问题的陈述-这样你就可以对不同类型的问题做出不同的反应。

        2
  •  8
  •   ssoto    8 年前

    你可以使用这个功能 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!"
    
        3
  •  5
  •   bortzmeyer    16 年前

    你真的应该发布:

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