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地址进行反向解析,这些基本技能都是网络开发和运维过程中不可或缺的部分。希望本文能帮助您更好地理解和应用这些技术!

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

相关文章
|
9月前
|
机器学习/深度学习 算法 安全
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
416 0
|
7月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
8月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
213 1
|
8月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
345 0
|
9月前
|
机器学习/深度学习 算法 调度
基于遗传算法GA算法优化BP神经网络(Python代码实现)
基于遗传算法GA算法优化BP神经网络(Python代码实现)
559 0
|
9月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
481 0
|
10月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
257 4
|
11月前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
10月前
|
数据采集 机器学习/深度学习 边缘计算
Python爬虫动态IP代理报错全解析:从问题定位到实战优化
本文详解爬虫代理设置常见报错场景及解决方案,涵盖IP失效、403封禁、性能瓶颈等问题,提供动态IP代理的12种核心处理方案及完整代码实现,助力提升爬虫系统稳定性。
551 0

推荐镜像

更多