Python 网络编程:端口检测与IP解析

简介: 本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。

Python 网络编程:端口检测与IP解析

在现代网络编程中,了解如何检查端口状态以及根据IP地址解析主机名是非常重要的技能。本文将介绍如何使用Python实现这两个功能,并提供相应的示例代码供读者参考。

一、检查端口是否打开

在网络应用中,判断一个特定端口是否开放可以帮助我们进行故障排查或安全审计。Python的socket库为我们提供了方便的工具来完成这一任务。以下是一个简单的示例,实现了对指定主机和端口的检查:

# 定义一个扫描给定主机IP地址和端口函数,参数为目标主机、目标端口
def connScan(tgtHost, tgtPort):
    try:
        # 创建一个socket对象
        connSkt = socket(AF_INET, SOCK_STREAM)
        # 设置socket超时时间
        connSkt.settimeout(1)  # 设置为1秒
        # 尝试连接到指定的主机和端口
        result = connSkt.connect_ex((tgtHost, tgtPort))
        # 如果返回值为0,说明端口开放
        if result == 0:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是开放的。")
        else:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是关闭的。")
    except Exception as e:
        print(f"发生异常:{e}")
    finally:
        connSkt.close()

代码解析

  • 使用socket()创建一个TCP/IP socket。
  • settimeout()方法用于设置连接的超时时间,以防止在连接过程中长时间阻塞。
  • connect_ex()方法尝试连接指定的主机和端口,并返回连接结果。
  • 最后,我们在finally块中确保无论成功与否都关闭socket连接,释放资源。

二、根据IP地址解析主机名

了解如何将IP地址转换为主机名是另一项重要的技能,特别是在调试网络问题时。我们同样可以通过socket库来实现这一功能。以下是相关示例代码:

# 定义一个主机解析函数,参数为目标主机,目标端口(可以是多个)
def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except Exception as e:
        print('[-] Cannot resolve \'%s\':Unknown host' %tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except Exception as e:
        print('\n[+] Scan Results for: ' +tgtIP)

    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + tgtPort)
        connScan(tgtHost, int(tgtPort))

代码解析

  • gethostbyaddr()方法根据IP地址返回对应的主机名及相关信息。
  • 我们同样在代码中使用了try...except结构,以捕获解析失败的情况并处理可能出现的异常。

三、整合上面两段代码

源码如下:

import optparse
import socket
from socket import *



def connScan(tgtHost, tgtPort):
    try:
        # 创建一个socket对象
        connSkt = socket(AF_INET, SOCK_STREAM)
        # 设置socket超时时间
        connSkt.settimeout(1)  # 设置为1秒
        # 尝试连接到指定的主机和端口
        result = connSkt.connect_ex((tgtHost, tgtPort))
        # 如果返回值为0,说明端口开放
        if result == 0:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是开放的。")
        else:
            print(f"端口 - {tgtPort} 在主机 {tgtHost} 上是关闭的。")
    except Exception as e:
        print(f"发生异常:{e}")
    finally:
        connSkt.close()


def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except Exception as e:
        print('[-] Cannot resolve \'%s\':Unknown host' %tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except Exception as e:
        print('\n[+] Scan Results for: ' +tgtIP)

    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('Scanning port ' + tgtPort)
        connScan(tgtHost, int(tgtPort))

def main():
    parser = optparse.OptionParser('usage %prog -H' + \
                                   '<target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] seperated by comma')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')

    if tgtHost == None or tgtPorts[0] == None:
        print('[-] You must specify a target host and port[s].')
        exit(0)
    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    main()

运行结果如下:

(.venv) (base) liuxiaowei@localhost 运维 % python scanner.py -H 'www.baidu.com' -p '21,22,80'

[+] Scan Results for: 110.242.68.4
Scanning port 21
端口 - 21 在主机 www.baidu.com 上是关闭的。
Scanning port 22
端口 - 22 在主机 www.baidu.com 上是关闭的。
Scanning port 80
端口 - 80 在主机 www.baidu.com 上是开放的。
(.venv) (base) liuxiaowei@localhost 运维 % python scanner.py -H '192.168.1.23' -p '21,22,23,135,445'

[+] Scan Results for: localhost
Scanning port 21
端口 - 21 在主机 192.168.1.23 上是关闭的。
Scanning port 22
端口 - 22 在主机 192.168.1.23 上是开放的。
Scanning port 23
端口 - 23 在主机 192.168.1.23 上是关闭的。
Scanning port 135
端口 - 135 在主机 192.168.1.23 上是关闭的。
Scanning port 445
端口 - 445 在主机 192.168.1.23 上是关闭的。

总结

通过以上两个示例代码,我们可以看到使用Python进行网络编程是多么简单而高效。无论是检查端口状态还是根据IP地址进行反向解析,这些基本技能都是网络开发和运维过程中不可或缺的部分。希望本文能帮助您更好地理解和应用这些技术!

原创不易,欢迎点赞、关注、转发、收藏!!!

相关文章
|
6月前
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
2月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
82 12
|
3月前
|
监控 安全 网络安全
网络安全新姿势:多IP配置的五大好处
服务器配置多IP地址,既能提升网络速度与安全性,又能实现多站点托管和故障转移。本文详解多IP的五大妙用、配置方法及进阶技巧。从理论到实践,合理规划IP资源,让服务器性能跃升新高度。
119 2
|
4月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
135 4
|
5月前
|
域名解析 API PHP
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
|
6月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
173 15
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
机器学习/深度学习 数据采集 自然语言处理
基于Python的情感分析与情绪识别技术深度解析
本文探讨了基于Python的情感分析与情绪识别技术,涵盖基础概念、实现方法及工业应用。文中区分了情感分析与情绪识别的核心差异,阐述了从词典法到深度学习的技术演进,并通过具体代码展示了Transformers架构在细粒度情感分析中的应用,以及多模态情绪识别框架的设计。此外,还介绍了电商评论分析系统的构建与优化策略,包括领域自适应训练和集成学习等方法。未来,随着深度学习和多模态数据的发展,该技术将更加智能与精准。
382 1
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
222 17
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
174 10

推荐镜像

更多
  • DNS