Dispersar/reunir E/S de socket asíncrono en .NET
-
02-07-2019 - |
Pregunta
Estoy intentando utilizar la API Stream.BeginWrite Async I/O en .NET para una situación de alto rendimiento con muchos mensajes cortos.Como tal, una API de dispersión/recolección reducirá enormemente la cantidad de cambios de contexto (y el uso de CPU).¿Esta API utiliza la API LPBUFFERS Win32?¿Existe una API alternativa para Scatter/Gather I/O?
Solución 4
No hay forma de dispersar/reunir E/S de sockets en .NET.Según una publicación de blog de MSFT, puede haber una API similar en .NET 4.5 (sea lo que sea...)
Otros consejos
Al observar las fuentes .net, la respuesta aceptada parece ser incorrecta.
SocketAsyncEventArgs
tiene un BufferList
atributo.Cuando se usa eso, en lugar del Buffer
atributo que solo puede contener un único bloque contiguo de memoria, las operaciones pueden hacer uso de DMA de dispersión/reunión, como Socket.SendAsync(SocketAsyncEventArgs)
usos WSASend
internamente, que
permite especificar múltiples buffers de envío, lo que lo hace aplicable al tipo de E/S de dispersión/reunión
y Socket.SendAsync(SocketAsyncEventArgs)
usos WSARecv
, eso
permite especificar múltiples buffers de recepción, lo que lo hace aplicable al tipo de E/S de dispersión/reunión
No tengo las fuentes .net 3.5 a mano, pero BufferList
existe desde .net 3.5, por lo que la dispersión/reunión podría haber sido compatible desde .net 3.5.Los requisitos mínimos del sistema operativo para WSASend y WSARecv están documentados como Windows Vista/Server 2003.
NÓTESE BIEN.No sé qué corriente estás usando, pero NetworkStream.BeginWrite
envía un único búfer a WSASend, por lo que no puede usarlo para dispersión/recolección.
Me sorprendería que pudieras acceder a las API de dispersión/reunión desde BCL (es para l33t w1n32 haxx0rz, ¿sabes?), pero siempre está P/Invoke (que, según he descubierto, es sorprendentemente fácil de usar).
Si desea profundizar en las entrañas del marco, hay algunas formas de hacerlo:
1) Reflector
2) MS abrió recientemente la fuente para fines de depuración, puede acceder a ella con VS2008 si habilita la opción en Depuración/Opciones/General
3) Koders.com parece alojar también la fuente del marco:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109