aioice里面candidate固定UDP端口测试

环境:

aioice0.9.0

问题描述:

aioice里面candidate固定UDP端口测试

解决方案:

/miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice

import hashlib
import ipaddress
import random
from typing import Optional
import logging# 配置日志级别,默认为 INFO,可改为 DEBUG 查看详细调试信息
logging.basicConfig(level=logging.INFO)class Candidate:"""表示一个 ICE 候选者,包括固定端口功能和多种优化。"""FIXED_PORT = 59990  # 定义固定端口def __init__(self,foundation: str,component: int,transport: str,priority: int,host: str,port: Optional[int] = None,  # 端口可以是 None,将被替换为固定端口type: str = "host",related_address: Optional[str] = None,related_port: Optional[int] = None,tcptype: Optional[str] = None,generation: Optional[int] = None,) -> None:"""初始化候选者对象,并强制使用固定端口。"""self.foundation = foundationself.component = componentself.transport = transportself.priority = priorityself.host = hostself.port = self.get_fixed_port() if port is None else port  # 设置为固定端口或提供的端口self.type = typeself.related_address = related_addressself.related_port = related_portself.tcptype = tcptypeself.generation = generation# 输出候选者信息到日志logging.info(f"创建候选者:host={self.host}, port={self.port}, type={self.type}")@classmethoddef get_fixed_port(cls) -> int:"""返回固定端口值,并记录日志。"""fixed_port = cls.FIXED_PORTlogging.debug(f"Returning fixed port: {fixed_port}")return fixed_port@classmethoddef from_sdp(cls, sdp: str):"""从 SDP 字符串中解析一个 ICE 候选者。示例 SDP:'6815297761 1 udp 659136 192.168.1.1 12345 typ host'"""bits = sdp.split()if len(bits) < 8:raise ValueError("SDP 描述字段不足")kwargs = {"foundation": bits[0],"component": int(bits[1]),"transport": bits[2],"priority": int(bits[3]),"host": bits[4],"port": cls.get_fixed_port(),  # 使用固定端口"type": bits[7],}# 提取 SDP 中的附加信息for i in range(8, len(bits), 2):if bits[i] == "raddr":kwargs["related_address"] = bits[i + 1]elif bits[i] == "rport":kwargs["related_port"] = int(bits[i + 1])elif bits[i] == "tcptype":kwargs["tcptype"] = bits[i + 1]elif bits[i] == "generation":kwargs["generation"] = int(bits[i + 1])return cls(**kwargs)def to_sdp(self) -> str:"""返回一个适用于 SDP 的字符串表示形式。"""sdp = f"{self.foundation} {self.component} {self.transport} {self.priority} {self.host} {self.port} typ {self.type}"if self.related_address is not None:sdp += f" raddr {self.related_address}"if self.related_port is not None:sdp += f" rport {self.related_port}"if self.tcptype is not None:sdp += f" tcptype {self.tcptype}"if self.generation is not None:sdp += f" generation {self.generation}"return sdpdef can_pair_with(self, other) -> bool:"""判断本地候选者是否可以与远程候选者配对。配对条件:- 组件相同- 使用相同的传输协议- IP 地址版本相同"""a = ipaddress.ip_address(self.host)b = ipaddress.ip_address(other.host)return (self.component == other.componentand self.transport.lower() == other.transport.lower()and a.version == b.version)def __repr__(self) -> str:"""返回候选者的字符串表示形式。"""return f"Candidate({self.to_sdp()})"# 工具函数部分
def candidate_foundation(candidate_type: str, candidate_transport: str, base_address: str) -> str:"""计算候选者的 Foundation(基础标识符)。"""key = f"{candidate_type}|{candidate_transport}|{base_address}"return hashlib.md5(key.encode("ascii")).hexdigest()def candidate_priority(candidate_component: int, candidate_type: str, local_pref: int = 65535) -> int:"""计算候选者优先级。优先级从高到低的顺序为:host > srflx > relay。"""type_preferences = {"host": 126,   # Host 类型优先级最高"srflx": 100,  # Server reflexive 类型"relay": 0,    # Relay 类型优先级最低}type_pref = type_preferences.get(candidate_type, 0)return (1 << 24) * type_pref + (1 << 8) * local_pref + (256 - candidate_component)# 测试代码部分
if __name__ == "__main__":# 测试创建候选者candidate = Candidate(foundation="1",component=1,transport="udp",priority=candidate_priority(1, "host"),host="192.168.168.77",  # 使用你的本地 IP 地址type="host",)print(candidate)  # 打印候选者信息print(candidate.to_sdp())  # 打印 SDP 字符串# 测试从 SDP 创建候选者sdp_example = "1 1 udp 100 192.168.1.1 12345 typ host"candidate_from_sdp = Candidate.from_sdp(sdp_example)print(candidate_from_sdp)  # 打印解析后的候选者print(candidate_from_sdp.to_sdp())  # 打印 SDP 字符串# 模拟 WebRTC 应用程序创建多个候选者candidates = [Candidate(foundation=str(i),component=1,transport="udp",priority=candidate_priority(1, "host"),host=f"192.168.1.{i % 255}",  # 使用不同的 IP 地址模拟不同设备type="host",)for i in range(1, 6)]for c in candidates:print(c)

运行没有成功

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件&#xff0c;比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …

linux-----网络编程

网络编程基础概念 IP地址&#xff1a;是互联网协议地址&#xff0c;用于在网络中唯一标识一台设备。在IPv4中&#xff0c;地址是32位的二进制数&#xff0c;通常以点分十进制表示&#xff0c;如192.168.1.1。IPv6是128位的地址&#xff0c;用于提供更多的地址空间&#xff0c;格…

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮&#xff0c;本次基于蓝牙通信的手机遥控智能灯设计功能如下&#xff1a; &#xff08;1&#xff09;用户可以通过蓝牙通信模块的作用下&#xff0c;在手机端遥控切换智能灯不同的工作模式&#xff1b; &#x…

阿里云百炼大模型生成贪吃蛇小游戏

阿里云百炼大模型生成贪吃蛇小游戏 为了在贪吃蛇游戏中添加背景音乐&#xff0c;我们可以使用Pygame的mixer模块。以下是修改后的代码&#xff0c;包含了背景音乐的加载和播放功能&#xff1a; 安装Pygame&#xff08;如果你还没有安装&#xff09;&#xff1a; pip install p…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍算法原理算法特点应用场景局限性 FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR1…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio&#xff0c;网址&#xff1a;https://developer.android.com/studio?hlzh-cn 2.下载加速器&#xff0c;注册账号&#xff0c;开启加速器。网址&#xff1a;放在文末。 3.下载安卓代码&#xff0c;项目的路径上不能有中文&#xff0c;特别是…

不会心理描写,神态描写怎么办?

不会心理描写&#xff0c;神态描写怎么办&#xff1f; 文学创作&#xff0c;精微之处在于心理与神态之描绘。 一、夯实基础&#xff0c;积累素材。 欲使心理与神态描写生动&#xff0c;需先厚积薄发。博览群书&#xff0c;尤重经典之作。 “读万卷书&#xff0c;行万里路。…

【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】

本博客内容主要是如何在Windows系统上为Claude客户端&#xff08;无需开通会员&#xff09;配置模型上下文协议(Model Context Protocol, MCP)服务器。 为什么选择 MCP&#xff1f; MCP 可帮助您在 LLM 之上构建代理和复杂的工作流程。LLM 经常需要与数据和工具集成&#xff0…

React:闭包陷阱产生和解决

在 React 中&#xff0c;闭包陷阱是一个常见的问题&#xff0c;尤其是在处理异步操作、事件处理器、或是定时器时。理解闭包的工作原理以及它在 React 中如何与状态和渲染交互&#xff0c;可以帮助你避免陷入一些常见的错误。 一、闭包陷阱的产生 1、什么是闭包陷阱&#xff1…

使用xjar 对Spring-Boot JAR 包加密运行

1 Xjar 介绍 Spring Boot JAR 安全加密运行工具&#xff0c;同时支持的原生JAR。 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动&#xff0c;动态解密运行的方案&#xff0c;避免源码泄露或反编译。 功能特性 无需侵入代码&#xff0c;只需要把编译好的…

[LeetCode-Python版] 定长滑动窗口1(1456 / 643 / 1343 / 2090 / 2379)

思路 把问题拆解成三步&#xff1a;入-更新-出。 入&#xff1a;下标为 i 的元素进入窗口&#xff0c;更新相关统计量。如果 i<k−1 则重复第一步。更新&#xff1a;更新答案。一般是更新最大值/最小值。出&#xff1a;下标为 i−(k-1) 的元素离开窗口&#xff0c;更新相关…

【AIGC-ChatGPT进阶副业提示词】末日生存指南 2.0:疯狂科学家的荒诞智慧

引言 在这个不断变化的世界中&#xff0c;末日似乎总是lurking在角落。但是&#xff0c;亲爱的幸存者们&#xff0c;不要害怕&#xff01;因为我&#xff0c;疯狂科学家2099&#xff0c;正在这里为你们带来最新版本的末日生存指南。这不是你祖母的应急手册&#xff0c;而是一本…

Web3.0安全开发实践:探索比特币DeFi生态中的PSBT

近年来&#xff0c;部分签名比特币交易&#xff08;PSBT&#xff09;在比特币生态系统中获得了显著关注。随着如Ordinal和基于铭文的资产等创新的兴起&#xff0c;安全的多方签名和复杂交易的需求不断增加&#xff0c;这使得PSBT成为应对比特币生态不断发展中不可或缺的工具。 …

Edge Scdn防御网站怎么样?

酷盾安全Edge Scdn&#xff0c;即边缘式高防御内容分发网络&#xff0c;主要是通过分布在不同地理位置的多个节点&#xff0c;使用户能够更快地访问网站内容。同时&#xff0c;Edge Scdn通过先进的技术手段&#xff0c;提高了网上内容传输的安全性&#xff0c;防止各种网络攻击…

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…

【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地

目录 一、需求 二、开发语言 三、效果 四、业务逻辑&#xff1a; 五、web端调用摄像头 六、示例代码 1、前端 2、后端 一、需求 web端使用jquery调用摄像头拍照&#xff0c;并使用PHP把base64编码转换成png格式图片&#xff0c;下载到本地。 由于js不能指定图片存储的…

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…

提炼关键词的力量:AI驱动下的SEO优化策略

内容概要 在当今数字化营销的环境中&#xff0c;关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略&#xff0c;以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略&#xff0c;特别是在关键词选择…