Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何通过SocketAsyncEventArgs发送非托管内存?_C#_Sockets_Memory_Marshalling_Socketasynceventargs - Fatal编程技术网

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

C#:如何通过SocketAsyncEventArgs发送非托管内存?,c#,sockets,memory,marshalling,socketasynceventargs,C#,Sockets,Memory,Marshalling,Socketasynceventargs,我有视频数据,并定期为许多客户生成新帧。我从库中得到的帧是一个IntPtr和一个表示字节数组大小的int。目前,我正在将其转化为一个“内存”,并通过网络流发送它,一旦我有了它,就可以实现对相当大的缓冲区的零拷贝 我想尝试使用SocketAsyncEventArgs做同样的事情,看看它是否性能更好,并为多个客户端尝试这些UserToken。但是,我不知道如何告诉SocketAsyncEventArgs发送IntPtr指向的内存块,其中int表示已知大小,同时保持零拷贝。似乎是一些聪明的编组或“记忆

我有视频数据,并定期为许多客户生成新帧。我从库中得到的帧是一个IntPtr和一个表示字节数组大小的int。目前,我正在将其转化为一个“内存”,并通过网络流发送它,一旦我有了它,就可以实现对相当大的缓冲区的零拷贝

我想尝试使用SocketAsyncEventArgs做同样的事情,看看它是否性能更好,并为多个客户端尝试这些UserToken。但是,我不知道如何告诉SocketAsyncEventArgs发送IntPtr指向的内存块,其中int表示已知大小,同时保持零拷贝。似乎是一些聪明的编组或“记忆玛莎”应该做的把戏,但我没有看到它

您看到实现这一点的方法了吗?

使用.Net Core 2.1+

您可以使用
SetBuffer(内存)

public void SetBuffer(内存缓冲区);

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

您需要将IntPtr复制到字节数组,然后发送数组:byte[]data=new byte[1024];封送处理副本(源,数据,0,数据长度);其中源是IntPtr。内存拷贝不会成为瓶颈。该网络将是。
public void SetBuffer (Memory<byte> buffer);