ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

使用python:循环发送测试报文 情景使用python:循环发送测试报文udp 单播本机192.9.2.77 接收端口: 6000 发送端口:6001对方 : 192.9.2.78 接收端口 6000 发送端口:6001编写一个程序两个电脑运行一个是本机一个是对方。本机与对方的区别只是ip地址不同。把ip地址以配置文件形式来存储吧。逻辑本机接收到数字a则返回a1.对方逻辑与本机一样接收到数字a,则返回a1.接收到信息后延时一秒再发送。网络拓扑┌─────────────────────┐ UDP ┌─────────────────────┐ │ 本机 PC1 │ (单播通信) │ 对方 PC2 │ │ IP: 192.9.2.77 │ ◄──────────────────► │ IP: 192.9.2.78 │ │ │ │ │ │ 接收端口: 6000 │ │ 接收端口: 6000 │ │ 发送端口: 6001 │ │ 发送端口: 6001 │ └─────────────────────┘ └─────────────────────┘核心逻辑两台电脑运行同一个程序唯一的区别是配置文件中的IP 地址不同。通信流程程序在6000端口监听接收数据接收到数字a后延时 1 秒从6001端口向对方的6000端口发送a1循环往复这样两台机器互相 ping-pong数字不断递增1 → 2 → 3 → 4 → ...模拟测试一个是windows另一个是虚拟机里的Debian# -*- coding: utf-8 -*- UDP 单播 ping-pong 测试程序 - 本机接收端口 recv_port(6000)发送端口 send_port(6001) - 收到数字 a延时 1 秒后返回 a1 - 输入 send 发送起始数字 1 - CtrlC 退出 import socket import time import json import threading def load_config(pathconfig.json): with open(path, r, encodingutf-8) as f: return json.load(f) def recv_loop(recv_sock, send_sock, peer_ip, recv_port): 接收线程收到数字 a - 延时1秒 - 发送 a1 while True: try: data, addr recv_sock.recvfrom(1024) msg data.decode(utf-8, errorsignore).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, flushTrue) 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)CtrlC 退出) print( , end, flushTrue) # 启动接收线程 recv_thread threading.Thread( targetrecv_loop, args(recv_sock, send_sock, peer_ip, recv_port), daemonTrue, ) 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, flushTrue) except KeyboardInterrupt: print(\n[退出] 收到 CtrlC正在关闭...) 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 }
返回列表