Разброс/сбор асинхронного ввода-вывода сокетов в .NET
-
02-07-2019 - |
Вопрос
Я пытаюсь использовать API асинхронного ввода-вывода Stream.BeginWrite в .NET для ситуаций с высокой пропускной способностью и множеством коротких сообщений.Таким образом, API разброса/сбора значительно сократит количество переключений контекста (и загрузку ЦП).Этот API вообще использует API LPBUFFERS Win32?Существует ли альтернативный API для ввода-вывода Scatter/Gather?
Решение 4
В .NET нет возможности выполнять разброс/сбор ввода-вывода сокетов.Согласно сообщению в блоге MSFT, аналогичный API может быть в .NET 4.5 (что бы это ни было...)
Другие советы
Глядя на источники .net, принятый ответ кажется неправильным.
SocketAsyncEventArgs
имеет BufferList
атрибут.Когда это используется, вместо Buffer
атрибут, который может содержать только один непрерывный блок памяти, операции могут использовать DMA разброса/сбора, например Socket.SendAsync(SocketAsyncEventArgs)
использует WSASend
внутренне, что
позволяет указать несколько буферов отправки, что делает его применимым к типу разброса/сбора ввода-вывода
и Socket.SendAsync(SocketAsyncEventArgs)
использует WSARecv
, что
позволяет указать несколько буферов приема, что делает его применимым к типу разброса/сбора ввода-вывода
У меня нет под рукой исходников .net 3.5, но BufferList
существует с .net 3.5, поэтому разброс/сбор могли поддерживаться с .net 3.5.Минимальные требования к ОС для WSASend и WSARecv документированы как Windows Vista/Server 2003.
Н.Б.Я не знаю, какой поток вы используете, но NetworkStream.BeginWrite
отправляет один буфер в WSASend, поэтому вы не можете использовать его для разброса/сбора.
Я был бы удивлен, если бы вы могли получить доступ к API-интерфейсам разброса/сбора из BCL (это для l33t w1n32 haxx0rz, вы знаете?), но всегда есть P/Invoke (который, как я обнаружил, на удивление прост в использовании).
Если вы хотите покопаться во внутренностях фреймворка, есть несколько способов сделать это:
1) Отражатель
2) MS недавно открыла исходный код для целей отладки, вы можете войти в него с помощью VS2008, если включите опцию в разделе «Отладка/Параметры/Общие».
3) Koders.com, похоже, также размещает исходный код фреймворка:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109