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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top