feat(main): 添加本地发送端口功能
- 在图形界面中添加本地发送端口输入框 - 在发送数据包时根据用户输入使用指定的本地端口 - 支持UDP、TCP、DNS和IP报文类型使用自定义本地端口
This commit is contained in:
parent
aa143115d5
commit
62df3394e5
16
main.py
16
main.py
@ -257,6 +257,7 @@ def send_packet():
|
||||
dest_host = dest_entry.get()
|
||||
dest_port = port_entry.get()
|
||||
packet_type = var.get()
|
||||
local_port = local_port_entry.get() # 获取本地发送端口
|
||||
|
||||
# 验证目标地址
|
||||
if not validate_ip_or_domain(dest_host):
|
||||
@ -266,9 +267,13 @@ def send_packet():
|
||||
if not validate_port(dest_port):
|
||||
raise ValueError("端口号无效,必须是有效的正整数(1-65535)")
|
||||
|
||||
# 验证本地发送端口号
|
||||
if local_port and not validate_port(local_port):
|
||||
raise ValueError("本地发送端口号无效,必须是有效的正整数(1-65535)")
|
||||
|
||||
# 解析目标IP地址
|
||||
dest_ip = socket.gethostbyname(dest_host)
|
||||
src_port = 12345
|
||||
src_port = int(local_port) if local_port else 12345 # 使用用户输入的本地端口或默认端口
|
||||
dest_port = int(dest_port)
|
||||
|
||||
# ICMP报文需要添加 RTT 计算
|
||||
@ -299,9 +304,11 @@ def send_packet():
|
||||
# 对于其他报文类型(UDP, TCP, DNS, IP)
|
||||
if packet_type == "UDP":
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
sock.bind(('', src_port)) # 绑定本地发送端口
|
||||
packet = construct_udp(src_port, dest_port)
|
||||
elif packet_type == "TCP":
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.bind(('', src_port)) # 绑定本地发送端口
|
||||
sock.connect((dest_ip, dest_port))
|
||||
packet = b"Hello, TCP!" # TCP 是面向连接的,这里发送简单的字符串
|
||||
sock.sendall(packet)
|
||||
@ -312,6 +319,7 @@ def send_packet():
|
||||
dns_server = '8.8.8.8' # Google Public DNS
|
||||
port = 53
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
sock.bind(('', src_port)) # 绑定本地发送端口
|
||||
query_packet = build_dns_query(dest_host)
|
||||
sock.sendto(query_packet, (dns_server, port))
|
||||
response, _ = sock.recvfrom(512)
|
||||
@ -331,6 +339,7 @@ def send_packet():
|
||||
# 创建原始套接字
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
|
||||
sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # 告诉内核IP头部已包含在数据包中
|
||||
sock.bind(('', src_port)) # 绑定本地发送端口
|
||||
|
||||
# 发送IP报文
|
||||
sock.sendto(packet, (dest_ip, 0))
|
||||
@ -369,6 +378,11 @@ ip_combobox = ttk.Combobox(window, values=local_ips)
|
||||
ip_combobox.grid(row=1, column=1)
|
||||
ip_combobox.current(0)
|
||||
|
||||
# 配置本地发送端口输入框
|
||||
tk.Label(window, text="本地发送端口:").grid(row=1, column=2)
|
||||
local_port_entry = tk.Entry(window)
|
||||
local_port_entry.grid(row=1, column=3)
|
||||
|
||||
# 配置目标地址输入框
|
||||
tk.Label(window, text="目标地址:").grid(row=2, column=0)
|
||||
dest_entry = tk.Entry(window)
|
||||
|
Loading…
Reference in New Issue
Block a user