首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何测试python端口上是否有打开的服务器?

如何测试python端口上是否有打开的服务器?
EN

Stack Overflow用户
提问于 2013-01-01 21:23:37
回答 2查看 21.3K关注 0票数 3

好的,所以我做了以下事情,如果它不能连接,它将引发一个异常:

代码语言:javascript
复制
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.settimeout(0.2)
>>> s.connect(("thisdomaiyndontexistduhh.com", 80))

但没有出现异常。如何测试带有Python套接字模块的端口上是否有打开的服务器?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 15:19:52

这就是为什么上面的代码永远不会失败。

我的ISP (Frontier)将DNS配置为对于任何不存在的域,它将返回"198.105.251.114“。因此,他们实际上在该地址的端口80上侦听web服务器,以显示一些垃圾/垃圾搜索结果。将您的主机更改为使用8.8.8.8 (Google服务器)作为DNS,上面的代码可能会正常工作。

考虑到这些类型的“强制网络”是常见的,您的代码应该做的第一件事是确定它是否在这样的网络上。因此,正确的做法是调用socket.gethostbyname("thisdomaiyndontexistduhh.com").如果它实际上返回了一个值,那么您就知道您位于这样一个DNS服务器的后面。因此,在要探测的服务器上执行gethostbyname调用。如果它返回相同的DNS地址,您就知道该服务器不存在。否则,继续connect调用以完成测试。

更新:我在假期里一直在学习Python,所以我用这个问题作为练习的借口。下面是我的代码:

代码语言:javascript
复制
import socket

def DoesServiceExist(host, port):
    captive_dns_addr = ""
    host_addr = ""

    try:
        captive_dns_addr = socket.gethostbyname("BlahThisDomaynDontExist22.com")
    except:
        pass

    try:
        host_addr = socket.gethostbyname(host)

        if (captive_dns_addr == host_addr):
            return False

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)
        s.connect((host, port))
        s.close()
    except:
        return False

    return True
票数 15
EN

Stack Overflow用户

发布于 2020-09-15 21:46:44

我发现这个解决方案使用telnetliburllib来测试urls中的服务器之间的连接,比如"https://example.com:6789/test",在这种情况下,我首先查找端口,然后查找模式。我只考虑"http“和"https”,但添加或更改模式(sftp、ssh等)很容易。

代码语言:javascript
复制
import telnetlib
import time
from urllib.parse import urlsplit

def verify_service(endpoint):

    netloc = "{0.netloc}".format(urlsplit(endpoint))
    scheme = "{0.scheme}".format(urlsplit(endpoint))

    if netloc == '':
        return False

    p = netloc.split(":")

    if len(p) == 2:
        host = p[0]
        port = p[1]
    else:
        host = p[0]
        port = 80 if scheme == "http" else "443"

    try:
        tn = telnetlib.Telnet(host,port)
        time.sleep(1)
    except:
        return False

    return True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14110841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档