当前位置:  开发笔记 > 编程语言 > 正文

在Python中测试套接字连接

如何解决《在Python中测试套接字连接》经验,为你挑选了3个好方法。

这个问题将扩展:在Python中打开套接字的最佳方法打开套接字时,
我如何测试它是否已经建立,并且它没有超时,或者通常会失败.

编辑:我试过这个:

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

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



1> kender..:

看来你抓住的不是你想要赶上的例外:)

如果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> ssoto..:

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


如果是`result> 0`,您将获得失败的[`errno`](https://docs.python.org/3.3/library/errno.html)值.然后,您可以执行类似`print errno.errorcode [result]`的操作,以获得有关失败的更有用的提示.

3> bortzmeyer..:

你应该发帖:

    您的示例的完整源代码

    它的实际结果,而不是摘要

这是我的代码,它有效:

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

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有