python使用socket检测TCP端口状态

之前有用php的socket来检测tcp端口监听情况,效果不理想,也可以说完全没啥用吧,今天在网上找了下python3检测TCP端口的代码,还比较好用,记录下以后备用,已经本地测试过了,代码中的细节我会进行说明

#!/usr/bin/python
#coding:utf-8

import socket

def checkTcp(ip, port)
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #设置超时时间
    s.settimeout(3)
    status = s.connect_ex((ip, port))
    if status == 0:
        print('port opening !')
    else:
        print('port closed !')
except Exception, e:
    print('port closed !')
    print('error details :%s' % e)

#用法    
checkTcp("sulao.cn","80")

因为不知道会出什么样的异常错误,整段代码用了异常处理try来捕捉异常

其中s.settimeout来设置一个超时时间,要不socket会一直尝试连接远程IP和端口,直到超时,这个时间比较长

另外connect_ex函数只能传入一个参数,所以这个函数里面还有一个小括号,不要漏掉了

上面提到了s.connect()与s.connect_ex(),更推荐使用s.connect_ex(),而非使用主动连接的s.connect()获取异常方式。
这样我们可以通过异常码更方便的进行判断操作。

也可以使用except Exception来捕捉错误详情

另外还有一点要注意,connect_ex方法返回0是正常,这点正和我们以前的返回值相反,不要搞错了。。。
当我们了解了基础操作后,可以进行下一步的检测工作,但此时我们忽略了一个问题,刚才我们检测的是本机的ip,但如果我们检测的是一个不存在的ip时会出现什么问题?
如果我们使用connect方法触发异常,并返回:

TimeoutError: [WinError 10060]

由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
如果我们使用connect_ex,则打印返回码10060。
但两者都存在一个问题,就是超时时间会等待很久。那么如何操作?一般的网络监测,设置3秒的时间就够了,所以添加s.settimeout(3)配置即可,当超时后,会引发socket.timeout: timed out异常,使用connect_ex则返回10035的状态码。
关于异常报错
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/554.html