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