feat(main): 添加 IP 报文发送功能

- 实现了 IP 报文的构造和发送- 添加了 IP 选项的界面按钮
- 优化了代码结构,为未来可能的报文类型扩展做准备
This commit is contained in:
fly6516 2025-01-07 17:05:59 +08:00
parent fdcc058c40
commit 773858452e

20
main.py
View File

@ -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()