C#:如何通过SocketAsyncEventArgs发送非托管内存?

问题描述 投票:0回答:1

我拥有视频数据,并正在定期为许多客户生成新的帧。我从库中获取帧为IntPtr和一个表示字节数组大小的整数。目前,我将其转换为“内存”,并通过NetworkStream发送,一旦有了它,就实现了对相当大的缓冲区的零复制。

我想尝试使用SocketAsyncEventArgs执行相同的操作,以查看其性能是否更好,并尝试为多个客户端使用那些UserTokens。但是,我不知道如何告诉SocketAsyncEventArgs发送一个由IntPtr指向的内存块,其中一个int表示已知大小,同时保持零拷贝。似乎有些巧妙的编组或“ MemoryMarshal”应该可以解决问题,但我没有看到它。

您看到实现此目的的方法吗?

c# sockets memory marshalling socketasynceventargs
1个回答
0
投票

使用.Net Core 2.1 +

您可以使用SetBuffer(Memory<byte>) see here设置存储器的缓冲区

public void SetBuffer (Memory<byte> buffer);

在.Net Framework中,您需要将其复制到byte[]。但是正如上面的评论所述,这不会成为您的瓶颈。

© www.soinside.com 2019 - 2024. All rights reserved.