Рассеять / собрать асинхронный сокет ввода-вывода в .NET - PullRequest
2 голосов
/ 22 сентября 2008

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

Ответы [ 4 ]

2 голосов
/ 01 июня 2015

Глядя на источники .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.

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

1 голос
/ 22 сентября 2008

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

0 голосов
/ 13 июля 2009

В .NET нет способа делать сокет / сборку ввода-вывода. Согласно сообщению в блоге MSFT, в .NET 4.5 может быть похожий API (что бы это ни было ...)

0 голосов
/ 22 сентября 2008

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

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

2) MS недавно открыла исходный код для целей отладки, вы можете подключиться к нему с VS2008, если включите опцию в разделе «Отладка / Параметры / Общие»

3) Судя по всему, на Koders.com размещен источник фреймворка:

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

...