2

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

4

4 回答 4

2

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

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

允许指定多个发送缓冲区,使其适用于 scatter/gather 类型的 I/O

Socket.SendAsync(SocketAsyncEventArgs)使用WSARecv,即

允许指定多个接收缓冲区,使其适用于 scatter/gather 类型的 I/O

我手边没有 .net 3.5 源,但BufferList自 .net 3.5 起就存在,因此自 .net 3.5 起可能已支持分散/聚集。WSASend 和 WSARecv 的最低操作系统要求记录为 Windows Vista / Server 2003。

注意我不知道您使用的是什么流,但NetworkStream.BeginWrite将单个缓冲区发送到 WSASend,因此您不能将其用于分散/收集。

于 2015-06-01T04:05:56.297 回答
1

如果你能从 BCL 获得分散/收集 api,我会感到惊讶(它用于 l33t w1n32 haxx0rz,你知道吗?),但总是有 P/Invoke(我发现它非常容易使用)。

于 2008-09-22T13:29:07.647 回答
0

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

1) 反射器

2)MS最近为调试目的打开了源代码,如果您启用了Debugging/Options/General下的选项,您可以使用VS2008进入它

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

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

于 2008-09-22T14:29:23.803 回答
-2

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

于 2009-07-13T09:59:59.513 回答