☰
使用python:循环发送测试报文
2026/10/4 23:42:16 网站建设 项目流程

情景:

使用python:循环发送测试报文

udp 单播

本机:192.9.2.77 接收端口: 6000 发送端口:6001

对方 : 192.9.2.78 接收端口 :6000 发送端口:6001

编写一个程序

两个电脑运行:一个是本机,一个是对方。

本机与对方的区别只是ip地址不同。把ip地址以配置文件形式来存储吧。

逻辑:

本机接收到数字a,则返回a+1.

对方逻辑与本机一样:接收到数字a,则返回a+1.

接收到信息后,延时一秒再发送。


网络拓扑

┌─────────────────────┐ UDP ┌─────────────────────┐ │ 本机 PC1 │ (单播通信) │ 对方 PC2 │ │ IP: 192.9.2.77 │ ◄──────────────────► │ IP: 192.9.2.78 │ │ │ │ │ │ 接收端口: 6000 │ │ 接收端口: 6000 │ │ 发送端口: 6001 │ │ 发送端口: 6001 │ └─────────────────────┘ └─────────────────────┘

核心逻辑

两台电脑运行同一个程序,唯一的区别是配置文件中的IP 地址不同。

通信流程:

  1. 程序在6000端口监听接收数据
  2. 接收到数字a后,延时 1 秒
  3. 从6001端口向对方的6000端口发送a+1
  4. 循环往复

这样两台机器互相 ping-pong,数字不断递增:1 → 2 → 3 → 4 → ...


模拟测试:

一个是windows

另一个是虚拟机里的Debian


# -*- coding: utf-8 -*- """ UDP 单播 ping-pong 测试程序 - 本机接收端口 recv_port(6000),发送端口 send_port(6001) - 收到数字 a,延时 1 秒后返回 a+1 - 输入 send 发送起始数字 1 - Ctrl+C 退出 """ import socket import time import json import threading def load_config(path="config.json"): with open(path, "r", encoding="utf-8") as f: return json.load(f) def recv_loop(recv_sock, send_sock, peer_ip, recv_port): """接收线程:收到数字 a -> 延时1秒 -> 发送 a+1""" while True: try: data, addr = recv_sock.recvfrom(1024) msg = data.decode("utf-8", errors="ignore").strip() try: num = int(msg) except ValueError: print(f"\n[警告] 收到非数字数据: {msg!r} (来自 {addr[0]}:{addr[1]})") continue print(f"\n[接收] 来自 {addr[0]}:{addr[1]} 的数字: {num}") time.sleep(1) reply = num + 1 send_sock.sendto(str(reply).encode("utf-8"), (peer_ip, recv_port)) print(f"[发送] 延时1秒后回复: {reply} -> {peer_ip}:{recv_port}") print(">>> ", end="", flush=True) except OSError: break except Exception as e: print(f"\n[错误] 接收线程异常: {e}") break def main(): cfg = load_config() local_ip = cfg["local_ip"] peer_ip = cfg["peer_ip"] recv_port = cfg["recv_port"] send_port = cfg["send_port"] # 接收 socket:绑定本机接收端口 recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) recv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) recv_sock.bind((local_ip, recv_port)) print(f"[接收] 已绑定 {local_ip}:{recv_port}") # 发送 socket:绑定本机发送端口(源端口固定为 send_port) send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) send_sock.bind((local_ip, send_port)) print(f"[发送] 已绑定 {local_ip}:{send_port}") print(f"[信息] 对方接收地址: {peer_ip}:{recv_port}") print("[提示] 输入 send 发送起始数字(1),Ctrl+C 退出") print(">>> ", end="", flush=True) # 启动接收线程 recv_thread = threading.Thread( target=recv_loop, args=(recv_sock, send_sock, peer_ip, recv_port), daemon=True, ) recv_thread.start() # 主线程:处理用户输入 try: while True: cmd = input().strip() if cmd.lower() == "send": first_num = 1 send_sock.sendto(str(first_num).encode("utf-8"), (peer_ip, recv_port)) print(f"[发送] 起始发送: {first_num} -> {peer_ip}:{recv_port}") elif cmd == "": pass else: print(f"[提示] 未知命令: {cmd!r},请输入 send") print(">>> ", end="", flush=True) except KeyboardInterrupt: print("\n[退出] 收到 Ctrl+C,正在关闭...") finally: recv_sock.close() send_sock.close() print("[退出] 程序已结束") if __name__ == "__main__": main()

config.json

{ "local_ip": "192.168.68.1", "peer_ip": "192.168.68.132", "recv_port": 6000, "send_port": 6001 }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询