Разброс/сбор асинхронного ввода-вывода сокетов в .NET

StackOverflow https://stackoverflow.com/questions/114847

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top