Répartir / rassembler des E / S de socket asynchrone dans .NET
-
02-07-2019 - |
Question
J'essaie d'utiliser l'API d'entrée-sortie asynchrone Stream.BeginWrite dans .NET pour une situation de débit élevé avec de nombreux messages courts. En tant que telle, une API dispersion / collecte réduira considérablement le nombre de changements de contexte (et d'utilisation du processeur). Cette API utilise-t-elle l'API Win32 de LPBUFFERS? Existe-t-il une autre API pour les E / S Scatter / Gather?
La solution 4
Il n’existe aucun moyen de diffuser / rassembler des E / S de socket dans .NET. Selon un article de blog MSFT, il pourrait y avoir une API similaire dans .NET 4.5 (quoi que ce soit ...)
Autres conseils
En regardant les sources .net, la réponse acceptée semble être fausse.
SocketAsyncEventArgs
a un attribut BufferList
. Lorsque cela est utilisé, au lieu de l'attribut Buffer
qui ne peut contenir qu'un seul bloc de mémoire contigu, les opérations peuvent utiliser DMA scatter / gather, comme Socket.SendAsync (SocketAsyncEventArgs)
utilise WSASend
en interne , que
permet de spécifier plusieurs tampons d'envoi, ce qui le rend applicable au type de dispersion / rassemblement d'E / S
et Socket.SendAsync (SocketAsyncEventArgs )
utilise WSARecv
, que
permet à plusieurs tampons de réception d'être spécifiés, ce qui le rend applicable au type de dispersion / rassemblement d'E / S
Je n'ai pas les sources .net 3.5 à portée de main, mais BufferList
existe depuis .net 3.5. Par conséquent, scatter / rassembl aurait pu être pris en charge depuis .net 3.5. La configuration système minimale requise pour WSASend et WSARecv est documentée sous Windows Vista / Server 2003.
N.B. Je ne sais pas quel flux vous utilisez, mais NetworkStream.BeginWrite
envoie un seul tampon à WSASend, vous ne pouvez donc pas l'utiliser pour la diffusion / collecte.
Je serais surpris si vous pouviez accéder aux api dispersées / rassemblées de la BCL (c'est pour le l33t w1n32 haxx0rz, vous savez?), mais il y a toujours P / Invoke (qui est étonnamment facile à utiliser, j'ai trouvé).
Si vous voulez creuser dans les entrailles du cadre, il existe plusieurs façons de le faire:
1) Réflecteur
2) MS a récemment ouvert la source à des fins de débogage. Vous pouvez y accéder avec VS2008 si vous activez l’option sous Débogage / Options / Général
3) Koders.com semble également héberger la source de la structure:
http://www.koders.com/ /fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109