2008-09-22 2 views
2

Я пытаюсь использовать API ввода-вывода Stream.BeginWrite Async в .NET для высокой пропускной ситуации со многими короткими сообщениями. Таким образом, API разброса/сбора данных значительно сократит количество переключателей контекста (и использования ЦП). Использует ли этот API API LPBUFFERS Win32 вообще? Существует ли альтернативный API для ввода/вывода Scatter/Gather?Scatter/gather async socket I/O в .NET

ответ

-2

Невозможно выполнить разнесение сокетов/собрать I/O в .NET. Согласно сообщению в блоге MSFT, в .NET 4.5 может быть аналогичный API (независимо от того, что есть ...)

+0

У вас есть ссылка на это сообщение в блоге? –

1

Я был бы удивлен, если бы вы могли добраться до разброса/сбора api из BCL (это для l33t w1n32 haxx0rz, вы знаете?), Но всегда есть P/Invoke (что удивительно просто в использовании, ve найдено).

0

Если вы хотите, чтобы копаться в кишках рамках, есть несколько способов сделать это:

1) Отражатель

2) MS недавно открыли исходный код для отладки, вы можете шагнуть в него с VS2008, если вы включите опцию под отладкой/Options/General

3) Koders.com, кажется, хостинг источник рамочное тоже:

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

2

Глядя на источники .net, принятый ответ кажется неправильным.

SocketAsyncEventArgs имеет атрибут BufferList. При том, что используется вместо атрибута Buffer, который может только держать один непрерывный блок памяти, операции могут использовать разброс/собирать DMA, так как Socket.SendAsync(SocketAsyncEventArgs) использует WSASend внутренне, что

позволяет несколько буферов посыла быть указано, что делает его применимым к разбросу/сборки типа I/O

и Socket.SendAsync(SocketAsyncEventArgs) использует WSARecv, что

позволяет использовать несколько буферов приема необходимо указать, что делает его применимым к разбросу/собрать тип I/O

не имеет .NET 3.5 источников под рукой, но BufferList существует с .net 3.5, поэтому разброс/сейсмограммой, возможно, был поддержан с .net 3.5. Минимальные требования к ОС для WSASend и WSARecv документируются как Windows Vista/Server 2003.

N.B. Я не знаю, какой поток вы используете, но NetworkStream.BeginWrite отправляет один буфер в WSASend, поэтому вы не можете использовать его для разброса/сбора.