我正在尝试在.NET中使用Stream.BeginWrite异步I / O API,以获得包含许多短消息的高吞吐量情况。因此,分散/聚集API将极大地减少上下文切换(和CPU使用)的数量。这个API是否完全使用LPBUFFERS Win32 API?是否有Scatter / Gather I / O的替代API?

有帮助吗?

解决方案 4

在.NET中无法进行套接字分散/收集I / O.根据MSFT博客文章,.NET 4.5中可能存在类似的API(无论是什么......)

其他提示

查看.net来源,接受的答案似乎是错误的。

SocketAsyncEventArgs BufferList 属性。当使用它时,操作可以使用分散/聚集DMA,而不是只能保存单个连续内存块的 Buffer 属性,如 Socket.SendAsync(SocketAsyncEventArgs) 使用 WSASend 那个

  

允许指定多个发送缓冲区,使其适用于I / O的分散/聚集类型

Socket.SendAsync(SocketAsyncEventArgs ) 使用 WSARecv

  

允许指定多个接收缓冲区,使其适用于I / O的分散/聚集类型

我没有.net 3.5源代码,但 BufferList 自.net 3.5以来一直存在,因此自.net 3.5以来可能支持scatter / gather。存在的WSASend和WSARecv的最低操作系统要求记录为Windows Vista / Server 2003。

N.B。我不知道你正在使用什么流,但是 NetworkStream.BeginWrite 会向WSASend发送一个缓冲区,所以你不能用它来进行分散/收集。

如果你能从BCL那里得到分散/聚集api,我会感到惊讶(对于l33t w1n32 haxx0rz,你知道吗?),但是总有P / Invoke(令人惊讶的是很容易使用,我已经实测值)。

如果你想深入了解框架的内容,有几种方法可以做到:

1)反射器

2)MS最近打开了用于调试目的的源代码,如果启用Debugging / Options / General

下的选项,可以使用VS2008进入它。

3)Koders.com似乎也在托管框架源:

http://www.koders.com/csharp /fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top