在.NET中分散/收集异步套接字I / O.

时间:2008-09-22 13:25:26

标签: .net asynchronous stream

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

4 个答案:

答案 0 :(得分:2)

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

SocketAsyncEventArgs具有BufferList属性。当使用它时,操作可以使用分散/聚集DMA,而不是Buffer属性只能容纳一个连续的内存块,因为Socket.SendAsync(SocketAsyncEventArgs)在内部使用WSASend

  

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

Socket.SendAsync(SocketAsyncEventArgs)使用WSARecv,即

  

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

我没有.net 3.5源码,但{。1}}自.net 3.5以来就存在,所以自.net 3.5以来可能支持scatter / gather。存在的WSASend和WSARecv的最低操作系统要求记录为Windows Vista / Server 2003。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

1)反射器

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

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

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

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

答案 3 :(得分:-2)

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