- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道如何在 C++ 中打开 UDP 套接字,我也知道如何通过它发送数据包。当我发送一个数据包时,我在另一端正确地收到了它,并且一切正常。
编辑:我还建立了一个完整的确认系统:数据包被编号、校验和确认,所以在任何时候我都知道我发送了多少数据包,比如说,在最后一秒实际上是从另一个端点收到的。现在,我发送的数据只有在收到所有数据包时才可读,所以我真的不关心数据包的顺序:我只需要它们全部到达,这样它们就可以随机顺序到达,而且它仍然会没关系,因为按顺序排列它们仍然没有用。
现在,我必须传输大量数据(例如 1 GB),并且我需要尽快传输这些数据。所以我将数据拆分为 512 字节的数据 block 并通过 UDP 套接字发送它们。
现在,由于 UDP 是无连接的,它显然不提供任何速度或传输效率诊断。因此,如果我只是尝试通过我的套接字发送大量数据包,我的套接字将只接受它们,然后将它们一次全部发送,我的路由器将发送第一对数据包,然后开始丢弃它们。所以这不是完成这项工作的最有效方法。
然后我做了一个循环:
我尝试进行一些校准,并获得了相当不错的传输率,但是我有一个线程以小束的形式连续发送数据包,但我除了关于间隔应该是多少以及数据包大小的实验性想法外一无所有一堆应该是。原则上,我可以想象 sleep 时间非常短,然后一次只发送一个数据包将是路由器的最佳解决方案,但就 CPU 性能而言,这是完全不可行的(我可能需要忙等待,因为两个连续数据包之间的时间真的很短)。
那么有没有其他的解决办法呢?任何被广泛接受的解决方案?我假设我的路由器有一个缓冲区或类似的东西,所以它可以一次接受一些数据包,然后它需要一些时间来处理它们。该缓冲区有多大?
我不是这方面的专家,所以任何解释都很好。
但是请注意,由于技术原因,根本无法我可以使用 TCP。
最佳答案
正如其他一些评论中提到的,您所描述的是流量控制系统。维基百科文章很好地概述了执行此操作的各种方法:
http://en.wikipedia.org/wiki/Flow_control_%28data%29
您现有的解决方案(在数据包组之间休眠一段硬编码时间)原则上是可行的,但是为了在真实世界的系统中获得合理的性能,您需要能够对数据包中的变化使用react网络。这意味着实现某种反馈,您可以根据网络特性(例如吞吐量和数据包丢失)自动调整传出数据速率和数据包大小。
一个简单的方法是使用重新传输的数据包的数量作为流量控制系统的输入。基本思想是,当您有大量重新传输的数据包时,您将减小数据包大小,降低数据速率,或两者兼而有之。如果重新传输的数据包很少,则可以增加数据包大小和数据速率,直到看到重新传输的数据包增加为止。
这有点过于简单化了,但我想您明白了。
关于c++ - 高效地发送 UDP 数据包流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28677092/
使用 Python 的 rtmplib 绑定(bind)并遇到一些问题。 首先, 我有这样的东西: import librtmp conn = librtmp.RTMP(...) conn.con
基本上,我是在查看 Motorstorm 排行榜时在 PS3 上窃听数据包。排行榜以 XML 格式发送到我的 ps3,但只有在我获得授权后。那么有人可以告诉我这三个数据包之间发生了什么,以及我如何在浏
我正在努力了解 TCP,但解析大量 RFC 并没有帮助。我相信我了解连接和关闭握手,但我似乎无法找到任何总结实际数据流的内容。 在连接和关闭握手之间 TCP 数据包看起来像什么? (特别是标题) 最佳
我正在尝试通过 RCON 端口与我的 Minecraft 服务器通信。 虽然我不知道如何使用套接字和流的东西。四处寻找,我发现他们都有一些共同点。套接字、输入流和输出流。 我在我的代码中试过了,但返回
我正在 UDP 之上设计一个简单的协议(protocol),现在我意识到其他人可以将数据包发送到我正在监听的端口。这样的数据包对于我的应用程序来说显然是不正确的(我现在不担心安全问题) 是否有过滤这些
我目前有一个具有可自定义滴答率的游戏服务器,但在本示例中,我们建议服务器每秒仅滴答一次或 1hz。我想知道如果客户端发送速率比服务器快,因为我当前的设置似乎不起作用,那么处理传入数据包的最佳方法是什么
我无法理解网络字节顺序以及通过 UDP 发送和接收数据的顺序。我正在使用 C#。 我有一个结构保持: message.start_id = 0x7777CCCC; message.me
我正在为 USB 设备编写代码。假设 USB 主机开始控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的 wLength)是端点 0 最大数据包大小的倍数。那么在主机接收到所有数据后(
我有一台 Windows PC、Marvell 交换机、Netgear 交换机和一台 Ubuntu 机器连接在一起(通过 Netgear 交换机)。 我最近从 Windows PC 向 Marvell
在查看数据包字节码时,您将如何识别 dns 数据包。 IP header 的协议(protocol)字段会告诉后面有一个 UDP 帧,但是在 UDP 帧内没有协议(protocol)字段来指定接下来会
我有一个通过 udf 的 802.11 (wifi) 上各种类型的流量的 pcap。由于 MTU,udp(或更准确地说是 IP)对 wifi 数据包进行分段。我目前正在使用 SharpPcap 读取并
我正在开发的 Core Audio 应用程序上有此崩溃日志。我目前正在调试它,所以我的问题不是关于崩溃本身,而是关于 的含义“k”包 . 这是什么意思 ? 我已阅读 this , 和 this (关于
我在一台 VM Ubuntu 16.04 机器上的 100 个多播组上生成 UDP 数据包,并在另一台 VM Ubuntu 16.04 机器上订阅这些组。两者都在由 Hyper-V 管理器运行的 HP
这个问题在这里已经有了答案: How can I fix 'android.os.NetworkOnMainThreadException'? (66 个回答) 6年前关闭。 我正在尝试创建一个简单的
我正在寻找使用 Java 来欺骗 UDP 数据包。是否有任何好的 Java 库可以让您创建自己的 RAW SOCKETS? 最佳答案 我会使用包装 libpcap 的 Java API . libpc
我在基于 Tyrus 的客户端和 tomcat Web 服务器之间使用没有压缩的 websocket。我在 tomcat 端看到消息传入和传出我的套接字,但如果我设置一个wireshark来观察它们传
我的应用程序在模拟器中运行时无法接收 UDP 数据包。 UDP 数据包由“localhost”上的以下 java 程序通过端口 49999 发送。 DatagramSocket clien
我正在开发一个 Google Glass 应用程序,它需要在工作线程中监听 UDP 数据包(与发送 UDP 数据包的现有系统集成)。我之前发布了一个问题(请参阅 here )并收到了一个答案,其中提供
我正在从客户端向服务器发送两个数据包。我遇到的问题是,在服务器上读取的数据使两个字符串对于发送的最长字符串具有相同的长度。例如: 如果字符串 1 为:1234 字符串 2 为:abcdefghi 服务
我知道这是不好的做法,但是可以执行以下操作吗? Send packet1 to UDP port 1 port 1 receives packet1 and sends it to port 2 po
我是一名优秀的程序员,十分优秀!