Streuung/sammeln asynchronen Socket I/O in .net
-
02-07-2019 - |
Frage
Ich versuche, den Stream zu verwenden. Daher verringert eine Streuung/Sammel -API die Anzahl der Kontextschalter (und die CPU -Verwendung) enorm. Verwendet diese API die LPBuffer -Win32 -API überhaupt? Gibt es eine alternative API für Streuung/Sammeln Sie I/O?
Lösung 4
There is no way to do socket scatter/gather I/O in .NET. According to a MSFT blog post, there may be a similar API in .NET 4.5 (whatever that is...)
Andere Tipps
Wenn man sich die .NET -Quellen ansieht, scheint die akzeptierte Antwort falsch zu sein.
SocketAsyncEventArgs
hat ein BufferList
Attribut. Wenn das verwendet wird, anstelle der Buffer
Attribut, das nur einen einzelnen zusammenhängenden Speicherblock halten kann, können Operationen als Streuung/Sammeln von DMA verwenden Socket.SendAsync(SocketAsyncEventArgs)
Verwendet WSASend
intern, das
Ermöglicht mehrere Send -Puffer
und Socket.SendAsync(SocketAsyncEventArgs)
Verwendet WSARecv
, das
Ermöglicht mehrere Empfangspuffer
Ich habe nicht die .NET 3.5 -Quellen griffbereit, aber BufferList
existiert seit .NET 3.5, so dass Streuung/Sammeln möglicherweise seit .NET 3.5 unterstützt worden sein. Die minimalen Betriebssystemanforderungen für WSASEND und WSARECV sind als Windows Vista / Server 2003 dokumentiert.
NB Ich weiß nicht, welchen Stream Sie verwenden, aber NetworkStream.BeginWrite
Sendet einen einzelnen Puffer an den WSaSend, sodass Sie das nicht für Streuung/Sammeln verwenden können.
I would be surprised if you could get to the scatter/gather api's from the BCL (it's for the l33t w1n32 haxx0rz, you know?), but there's always P/Invoke (which is suprisingly easy to use, I've found).
If you want to dig into the guts of the framework, there are a few ways to do it:
1) Reflector
2) MS recently opened up the source for debugging purposes, you can step into it with VS2008 if you enable the option under Debugging/Options/General
3) Koders.com seem to be hosting the framework source too:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109