当前位置: 首页 > 知识库问答 >
问题:

sendto() recvfrom() buffer 混淆 Datagram

笪德华
2023-03-14

对一个概念感到困惑...

假设客户端调用sendto()两次,每次向服务器发送100字节的数据报。那么如果服务器调用recvfrom(),接收缓冲区为200字节,它会将两个数据报接收到同一个缓冲区吗?

从我所了解到的……如果我发送到(100),那么我将在相同的数据报传输“空间”上接收来自(100)的recv

但是由于它是发送 100 的两次..那么 recvfrom(200) 会在不同的缓冲区上吗?

谢谢。

共有3个答案

邹博明
2023-03-14

取决于协议。对于TCP等流协议,没有消息边界,您可以感知任何分块。对于UDP等基于消息的协议,消息会被保留,您将读取100字节两次(假设数据包没有丢失)。

诸修伟
2023-03-14

对于 UDP,一个 recv(2) 只消耗一个输入数据报。较大的SO_RCVBUF值允许在内核中缓冲更多数据报,但不要不将它们“粘合”在一起。

如果你在Linux,它提供了一个不可移植的recvmmsg(2),它可以在一个系统调用中读取多个数据报。

戚建华
2023-03-14

因为您使用的是 UDP,所以如果您调用 sendto 2 次,您也将有 2 个接收。完全保留数据包的内容。如果您发送 2 乘以 100 字节,您将永远不会收到 200 字节。

我必须警告你,UDP是最好的努力。有可能数据包被丢弃,您只收到一个数据包,第一个或第二个,甚至根本没有数据包。

另一个警告是,您必须确保接收缓冲区足够大,在您的描述中,这是可以的,但如果接收缓冲区太小,一些实现会丢弃数据包,一些实现则会将其截断。

UDP实际上是IP之上非常薄的一层。IP是将数据包从一端传递到另一端的人。从用户的角度来看,正在发送的数据包是未被触及的。

 类似资料:
  • 我一直在摆弄Proguard配置,我想测试只是为了优化 但我仍然会遇到这样的错误: java.lang.IllegalArgumentExc0019:找不到[org/apache/log/log4j/core/jackson/Log4jXmlMoules](有1个已知的超级类)和[org/apache/log/log4j/core/jackson/Log4jJsonMoules](有4个已知的超级

  • Powershell的混淆目前已经使用的越来越多,国内外也有了较多的研究,在今年的BH大会上也有对应的议题,关注点是反混淆,那么里面的一些姿势很值得我们学习,我们提供一些混淆实例,来让大家对于PS的混淆做到一个初步了解,也为防御混淆提供一些思路。 实例 在混淆之前,先看看powershell编码执行的方式。 -EC,-EncodedCommand,-EncodedComman,-EncodedCo

  • 问题内容: 我正在寻找一个好的Java混淆器。 我已经对以下Java混淆器进行了初步研究:proguard,yguard,retroguard,dasho,alatorari,jshrink,smokescreen,jobfuscate,marvin,jbco,jode,javaguard,jarg,joga,cafebabe,donquixote,mwobfu,bbmug,zelix klass

  • 我对混淆有问题。为了获得更好的想象力: JAVA代码 本机代码 在我想发布一个混淆版本之前,一切都很好。这个类中的Java类(例如)和方法的名称被proGuard重命名为“a”和“a()”(这可能并不总是相同的),但在本机代码中,方法和类的原始名称保持不变,因为它被硬编码为字符串,如下所示: ...有没有办法动态设置方法名?

  • 我正在努力解决JavaFX应用程序的模糊问题。以本项目为基础: Proguard配置文件:-dontoptimized-dontshrink 有人有JavaFX模糊处理的经验吗?

  • 混淆nick /** * 混淆nick * * @memberOf Tida * @name mixNick * @function * * @param {object} options 入参 * @param {number} options.sellerNick 卖家昵称,微淘应用必填,互动应用选填 * @param {function} callback 回调函数