From 773858452ec03a18a487fb5b9ae982057c3be9b0 Mon Sep 17 00:00:00 2001 From: fly6516 Date: Tue, 7 Jan 2025 17:05:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(main):=20=E6=B7=BB=E5=8A=A0=20IP=20?= =?UTF-8?q?=E6=8A=A5=E6=96=87=E5=8F=91=E9=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现了 IP 报文的构造和发送- 添加了 IP 选项的界面按钮 - 优化了代码结构,为未来可能的报文类型扩展做准备 --- main.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index ec071fd..82f7b1f 100644 --- a/main.py +++ b/main.py @@ -277,7 +277,7 @@ def send_packet(): return # 结束函数 - # 对于其他报文类型(UDP, TCP, DNS) + # 对于其他报文类型(UDP, TCP, DNS, IP) if packet_type == "UDP": sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) packet = construct_udp(src_port, dest_port) @@ -303,6 +303,21 @@ def send_packet(): result.set("DNS解析失败") sock.close() return # 结束函数 + elif packet_type == "IP": # 添加IP报文类型处理 + # 构造IP头部 + payload = b"Hello, IP!" # 示例负载数据 + ip_header = construct_ip_header(src_ip, dest_ip, len(payload), socket.IPPROTO_RAW) + packet = ip_header + payload + + # 创建原始套接字 + sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # 告诉内核IP头部已包含在数据包中 + + # 发送IP报文 + sock.sendto(packet, (dest_ip, 0)) + result.set(f"IP报文发送成功!") + sock.close() + return # 结束函数 # 发送报文 sock.sendto(packet, (dest_ip, dest_port)) @@ -351,7 +366,8 @@ var = tk.StringVar(value="ICMP") tk.Radiobutton(window, text="ICMP", variable=var, value="ICMP").grid(row=4, column=1) tk.Radiobutton(window, text="UDP", variable=var, value="UDP").grid(row=4, column=2) tk.Radiobutton(window, text="TCP", variable=var, value="TCP").grid(row=4, column=3) -tk.Radiobutton(window, text="DNS", variable=var, value="DNS").grid(row=4, column=4) # 添加DNS选项 +tk.Radiobutton(window, text="DNS", variable=var, value="DNS").grid(row=4, column=4) +tk.Radiobutton(window, text="IP", variable=var, value="IP").grid(row=4, column=5) # 添加IP选项 # 配置结果显示 result = tk.StringVar()