首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArraySegments的BeginReceive/SocketAsyncEventArgs列表

ArraySegments的BeginReceive/SocketAsyncEventArgs列表
EN

Stack Overflow用户
提问于 2017-03-09 15:33:47
回答 1查看 242关注 0票数 3

ArraySegment<byte>列表传递给Socket.BeginReceive/SocketAsyncEventArgs的理由是什么?

constructor

代码语言:javascript
复制
public IAsyncResult BeginReceive(
    IList<ArraySegment<byte>> buffers,
    SocketFlags socketFlags,
    AsyncCallback callback,
    object state
)

量程表: 缓冲器 类型:System.Collections.Generic.IList<ArraySegment<Byte>> Byte类型的数组,它是接收到的数据的存储位置。 ..。

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

,但为什么我要将几个段传递给这些方法呢?在SocketAsyncEventArgs的情况下,似乎会使这些对象的池操作变得复杂,我看不出背后的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 22:24:31

我在this question和MSDN中发现的情况:

  1. 有一个重载版本的BeginReceive,它采用Byte。当这是满的,或一个数据包已经收到(这是合乎逻辑的顺序),回调将被触发。
  2. 正如我在答复中所指出的那样:

读取可以是该值的倍数,因为如果数据包按顺序到达,那么在逻辑上第一个数据包到达的那一刻,所有这些信息对应用程序都是可见的。在这种情况下,您可以同时从所有连续排队的数据包中读取数据。

这意味着:如果一个传入的数据包出现故障(即序列号比预期的要高),它将被保留。一旦丢失的数据包到达,所有可用的数据包都会写入您的列表中,并且只会触发一个回调,而不是对已经可用的所有数据包一次又一次地触发回调,每个包都尽可能地填充缓冲区,以此类推。

这意味着,这个实现节省了大量开销,方法是在数组列表中提供所有可用的数据包,只调用一次回调,而不是从网络堆栈执行大量的内存复制到缓冲区,并反复调用回调。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42699348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档