在.NET中分散/收集异步套接字I / O.
-
02-07-2019 - |
题
我正在尝试在.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