开始阵列分销列表的beginReceive/socketAsynceventargs



ArraySegment<byte>的A 列表的推理到Socket.BeginReceive/SocketAsyncEventArgs

Socket.BeginReceive构造函数的MSDN甚至无法正确描述第一个参数):

public IAsyncResult BeginReceive(
    IList<ArraySegment<byte>> buffers,
    SocketFlags socketFlags,
    AsyncCallback callback,
    object state
)

对核心:
缓冲区
类型:System.Collections.Generic.IList<ArraySegment<Byte>>
Byte类型的数组是收到数据的存储位置。
...

我认为主要的想法是在大物体堆上分配一个大型缓冲区,然后将此缓冲区的一部分传递给Socket.BeginReceive,以避免在堆周围固定小物体并弄乱GC的工作。

但是,为什么我要通过将几个段传递给这些方法?SocketAsyncEventArgs的情况下,看来这会使这些对象的汇总变得复杂,而我不这样请参阅此背后的原因。

我在这个问题和MSDN中发现的内容:

  1. 有一个字节阵列的BeginReceive的超载版本。当已满或已收到数据包(从逻辑上是秩序)时,回调将被触发。

  2. 如我所链接的答案中所述:

读取可以是倍数的倍数,因为如果数据包不顺序到达,则所有这些内容都可以在逻辑上首先到达的那一刻可见。在这种情况下,您可以一次从所有连续的排队数据包中阅读。

这意味着:如果有一个输入的数据包(即,序列号都高于预期的序列号),则将保留。一旦丢失的数据包到达,所有可用的数据包都写在您的列表中,仅发射一个回调,而不是一遍又一遍地发射回调,以供所有已经可用的数据包,每个都将您的缓冲区填充为尽可能远,等等。

因此,这意味着,此实现通过在数组列表中提供所有可用的数据包来节省很多开销反复致电您回调。

相关内容

  • 没有找到相关文章

最新更新