yxy殷 2022-12-22 12:00 采纳率: 0%
浏览 108
已结题

python捕获本机IP包并解析

问题遇到的现象和发生背景

这是一个计网的实验。需要捕获本机的IP包。

遇到的现象和发生背景,请写出第一个错误信息

但是一直在报错,就是在补货的时候会说我的端口被占用。

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
import socket
print(socket.IPPROTO_TCP)
def catchIPData():
    # 获取本机IP作为公共网络接口
    HOST = socket.gethostbyname(socket.gethostname())
    # 创建一个原始套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    # 将该套接字与公共网络接口绑定
    s.bind((HOST,0))
    # 设定该套接字包含IP数据报首部
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    # 设定该套接字接收所有数据包
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
    # 接收一个数据包并返回
    packet = s.recvfrom(4096)
    return packet
def decodeIpHeader(packet):
    # 创建一个空字典
    IPDatagram = {}
    # 根据RFC791协议对数据包进行解析
    IPDatagram['version'] = packet[0] >> 4
    IPDatagram['headLength'] = packet[0] & 0x0f
    IPDatagram['serviceType'] = packet[1]
    IPDatagram['totalLength'] = (packet[2] << 8) + packet[3]
    IPDatagram['identification'] = (packet[4] << 8) + packet[5]
    IPDatagram['flag'] = packet[6] >> 5
    IPDatagram['moreFragment'] = IPDatagram['flag'] & 1
    IPDatagram['dontFragment'] = (IPDatagram['flag'] >> 1) & 1
    IPDatagram['fragmentOffset'] = ((packet[6] & 0x1f) << 8) + packet[7]
    IPDatagram['TTL'] = packet[8]
    IPDatagram['protocol'] = packet[9]
    IPDatagram['headerCheckSum'] = (packet[10] << 8) + packet[11]
    # 源IP地址和目的IP地址都按照IP地址的格式用字符串存储
    IPDatagram['sourceAddress'] = "%d.%d.%d.%d" % (packet[12], packet[13], packet[14], packet[15])
    IPDatagram['destinationAddress'] = "%d.%d.%d.%d" % (packet[16], packet[17], packet[18], packet[19])
    # 根据数据包中头部长度确定是否有选项,如果有则添加至option列表中
    IPDatagram['options'] = []
    if IPDatagram['headLength'] > 5:
        step = 5
        while step < IPDatagram['headLength']:
            IPDatagram['options'].append(packet[step * 4])
            IPDatagram['options'].append(packet[step * 4 + 1])
            IPDatagram['options'].append(packet[step * 4 + 2])
            IPDatagram['options'].append(packet[step * 4 + 3])
            step += 1
    # 根据数据包中的总长度将数据部分添加至data列表中
    IPDatagram['data'] = []
    step = IPDatagram['headLength'] * 4
    while step < IPDatagram['totalLength']:
        IPDatagram['data'].append(packet[step])
        step += 1
    # 返回储存有数据包数据的字典
    return IPDatagram
mm=catchIPData()
print(decodeIpHeader(mm))

运行结果及详细报错内容

D:\pycharm\test\Scripts\python.exe "C:\Users\helen yin\PycharmProjects\pythonProject\main.py"
6
Traceback (most recent call last):
File "C:\Users\helen yin\PycharmProjects\pythonProject\main.py", line 54, in
mm=catchIPData()
File "C:\Users\helen yin\PycharmProjects\pythonProject\main.py", line 7, in catchIPData
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
File "C:\Users\helen yin\AppData\Local\Programs\Python\Python38\lib\socket.py", line 231, in init
_socket.socket.init(self, family, type, proto, fileno)
OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

进程已结束,退出代码1

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我尝试去查询了这个错误发生的原因,但是当我尝试杀死进程的时候我发现首先我不知道我现在正在运行的是哪个进程,其次

img

我查询了某个进程准备杀死他的时候

img

他杀不死

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

希望可以得到解答

  • 写回答

5条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-22 12:11
    关注

    ChatGPT尝试为您解答,仅供参考
    当您试图捕获本机的 IP 包时遇到端口被占用的错误,可能是因为其他进程正在使用该端口。在您的代码中,您正在将套接字绑定到公共网络接口的 0 号端口(即系统分配的任意端口)。因此,在您运行代码时,可能会发现这个端口已被占用。


    为了避免这个问题,您可以尝试使用更高的端口,例如 1024 或更高。这些端口通常被视为“用户端口”,可供应用程序使用,而不是系统使用。您可以在调用 bind 方法时将端口参数替换为所需的端口号:

    s.bind((HOST, 1024))
    

    此外,您还可以尝试使用 getsockname 方法检查套接字绑定的实际端口号,以确保您已成功绑定到所需端口:

    print(s.getsockname()[1])
    
    评论

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 创建了问题 12月22日

悬赏问题

  • ¥15 FFmpeg 成功推流到 Nginx RTMP 服务器但无法用 ffplay 或 VLC 播放
  • ¥15 用G92修改坐标,结果无效。
  • ¥15 请修改以下C语言代码使其能正确输出最短路径
  • ¥20 抖音商城拉码器安卓报错求解决办法或者有新的拉码脚本也可以介绍一下
  • ¥15 MPLAB IDE V2.35 报错make[2]: *** [build/default/production/_ext/1472/MSSP_I2C.p1] Error 1
  • ¥15 Unity2D URP项目TextMeshPro(3D)无法显示文字
  • ¥15 新唐M451 DTMF检测和发送代码修改
  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。
  • ¥65 python批量提取发票的信息
  • ¥15 虚幻五引擎内容如何上传至网盘?