将ArraySegment<byte>列表传递给Socket.BeginReceive/SocketAsyncEventArgs的理由是什么?
public IAsyncResult BeginReceive(
IList<ArraySegment<byte>> buffers,
SocketFlags socketFlags,
AsyncCallback callback,
object state
)量程表: 缓冲器 类型:
System.Collections.Generic.IList<ArraySegment<Byte>>Byte类型的数组,它是接收到的数据的存储位置。 ..。
我认为主要的想法是在大对象堆上分配一个大缓冲区,然后将这个缓冲区的一部分传递给Socket.BeginReceive,以避免将小对象固定在堆周围,并破坏GC的工作。
,但为什么我要将几个段传递给这些方法呢?在SocketAsyncEventArgs的情况下,似乎会使这些对象的池操作变得复杂,我看不出背后的原因。
发布于 2017-03-19 22:24:31
我在this question和MSDN中发现的情况:
BeginReceive,它采用Byte。当这是满的,或一个数据包已经收到(这是合乎逻辑的顺序),回调将被触发。读取可以是该值的倍数,因为如果数据包按顺序到达,那么在逻辑上第一个数据包到达的那一刻,所有这些信息对应用程序都是可见的。在这种情况下,您可以同时从所有连续排队的数据包中读取数据。
这意味着:如果一个传入的数据包出现故障(即序列号比预期的要高),它将被保留。一旦丢失的数据包到达,所有可用的数据包都会写入您的列表中,并且只会触发一个回调,而不是对已经可用的所有数据包一次又一次地触发回调,每个包都尽可能地填充缓冲区,以此类推。
这意味着,这个实现节省了大量开销,方法是在数组列表中提供所有可用的数据包,只调用一次回调,而不是从网络堆栈执行大量的内存复制到缓冲区,并反复调用回调。
https://stackoverflow.com/questions/42699348
复制相似问题