当前位置: 首页 > news >正文

Python 通过UDP传输超过64k的信息

在UDP中,单个数据包的最大尺寸通常受到网络层的限制,这通常被称为最大传输单元(MTU)。在以太网环境中,标准的MTU大小通常为1500字节。尽管有些网络环境可能支持更大的数据包,但是UDP数据包的理论最大限制是65535字节(64KB),这是由于UDP头部的16位长度字段决定的。

然而,如果你需要发送超过这个限制的数据,你必须将数据分割成多个较小的数据包,并在接收端重新组装它们。下面是一个Python示例,展示了如何通过UDP发送和接收超过64KB的数据。

服务器端(接收端)代码

import socket  def receive_large_data(sock, expected_size):  data = b''  while len(data) < expected_size:  remaining = expected_size - len(data)  packet = sock.recv(min(remaining, 4096))  # 使用较小的缓冲区大小以模拟实际情况  if not packet:  raise Exception("Connection closed by remote host")  data += packet  return data  def start_server():  server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  server_sock.bind(('localhost', 12345))  while True:  data, addr = server_sock.recvfrom(1024)  # 接收数据包,包含数据大小和实际数据的第一部分  total_size = int(data.decode())  print(f"Expecting {total_size} bytes of data from {addr}")  large_data = receive_large_data(server_sock, total_size)  print(f"Received {len(large_data)} bytes of data from {addr}")  # 处理数据...  # 例如,可以将其写入文件或进行其他处理  if __name__ == "__main__":  start_server()

客户端(发送端)代码

import socket  def send_large_data(sock, data):  # 首先发送数据的大小,以便服务器知道要接收多少数据  sock.sendto(str(len(data)).encode(), ('localhost', 12345))  # 然后将数据分成小块并发送  chunk_size = 4096  # 可以根据需要调整这个大小  for i in range(0, len(data), chunk_size):  sock.sendto(data[i:i+chunk_size], ('localhost', 12345))  def start_client():  client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建一个大于64KB的数据包作为示例  large_data = b'x' * 70000  # 70,000 字节的数据  send_large_data(client_sock, large_data)  if __name__ == "__main__":  start_client()

注意

  1. 这个示例仅用于教学目的,并没有处理所有可能的错误情况。在生产环境中使用时,请确保添加适当的错误处理和重试逻辑。

  2. 这个示例使用了本地回环地址(localhost)和端口号12345。在实际应用中,请根据需要修改这些值。

  3. 在实际应用中,可能还需要考虑数据的加密、压缩和校验等问题,以确保数据的完整性和安全性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习入门案例:运用神经网络实现价格分类
  • linux中守护进程管理方式
  • 【学习笔记】Day 14
  • 和等于 k 的最长子数组长度(LeetCode)
  • MySQL windows版本安装
  • How do you implement OpenAI GPT-3 Api Client in PHP?
  • 古希腊掌管类型转换的神 boost::lexical_cast
  • 掌握Objective-C中的NSSpellServer:拼写检查的艺术
  • MySQL 8
  • QT、C++简单界面设计
  • js实现图片以鼠标为中心滚轮缩放-vue
  • 深度学习中常用概念总结
  • 一次sql请求,返回分页数据和总条数
  • 【深度学习】【语音TTS】GPT-SoVITS v2 实战,训练一个人的音色,Docker镜像
  • Centos7安装Redis(采用docker安装方式)
  • C语言笔记(第一章:C语言编程)
  • GraphQL学习过程应该是这样的
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript的使用你知道几种?(上)
  • Java超时控制的实现
  • Material Design
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • python 装饰器(一)
  • Redis的resp协议
  • Webpack 4x 之路 ( 四 )
  • 类orAPI - 收藏集 - 掘金
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 微信小程序:实现悬浮返回和分享按钮
  • 学习笔记:对象,原型和继承(1)
  • 《天龙八部3D》Unity技术方案揭秘
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​2020 年大前端技术趋势解读
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)WCF的Binding模型
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Unity3DUnity3D在android下调试
  • (转)创业家杂志:UCWEB天使第一步
  • ***检测工具之RKHunter AIDE
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net core控制台应用程序初识
  • .net refrector
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET是什么
  • /run/containerd/containerd.sock connect: connection refused
  • @RequestBody与@ModelAttribute
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116