小编Pet*_*ter的帖子

使用托管内存进行注册I/O RIOSend函数调用

我正在研究一个需要高速,低延迟/抖动通信的系统,它是用C#编写的.我们看到有一种新机制可以通过名为Windows Registered IO的套接字获得更好的性能http://www.serverframework.com/asynchronousevents/2011/10/windows-8-registered-io-networking-extensions.html

...但目前还没有C#可用...而且它肯定会在C++测试中表现出更好的性能.

无论如何,我已经编写了Managed C++/CLI部分来创建一个DLL,这似乎可以很好地与C#和大大改进的数字.

但我想知道我是否可以通过发送保存缓冲区副本...

目前C++包装器如下所示:

bool ManagedSendData( array<byte> ^ buf, ULONG bufLen )
{
// must pin array memory until we're done with sending it, 
// at which point it'll be copied into the unmanaged memory

   pin_ptr<Byte> p = &buf[0];   // pinning one element of an array pins the whole array
   unsigned char * cp = p;

   return _RIObs->SendData( cp, bufLen );
}
Run Code Online (Sandbox Code Playgroud)

_RIObs实现已注册I/O功能的非托管C++对象在哪里.在该函数中,它将数据复制到启动时注册的缓冲区中RIORegisterBuffer(),然后调用RIOSend()以通知操作系统有数据要发送.

所以,我的问题是我可以让这个Managed C++对象的用户在启动时传入一个托管字节数组并调用GCHandle::Alloc()它来修复它并防止垃圾收集,RIORegisterBuffer()在托管应用程序中调用它,然后在使用它时使用它托管的C++对象还活着吗?我将注册该托管缓冲区内存而不是非托管内存,当用户想要发送数据时,它们将填满他们已经引用的缓冲区,并通知我们要发送多少字节.这是一个阻塞发送并等待一个完成事件,所以他们不会再次使用缓冲区,直到操作系统完成它与数据的关系.

只要非托管应用程序可以互换使用托管或非托管内存,只要托管内存被锁定直到不再需要它,它似乎就可以工作.

c# sockets c++-cli

5
推荐指数
1
解决办法
1083
查看次数

标签 统计

c# ×1

c++-cli ×1

sockets ×1