web-dev-qa-db-fra.com

Écrire un serveur TCP/IP hautement évolutif en C # 5 avec le modèle async/wait?

Je suis chargé de concevoir un serveur TCP/IP assez simple qui doit accepter les connexions de plusieurs clients. Il doit être écrit en C # et j'utilise .NET 4.5. Cela dit, je ne sais pas quel est l'état actuel de la technologie en matière d'évolutivité serveur/client TCP/IP dans .NET 4.5.

J'ai vu cet article: Comment écrire un serveur évolutif basé sur TCP/IP . Mais cela concerne .NET 2.0 et 3.5 et ne fait aucune mention du modèle async/wait.

Je suis capable d'écrire un serveur "à l'ancienne" ... mais je veux savoir ce qu'est la "nouvelle façon".

  • Quelle est la meilleure façon d'utiliser les nouvelles méthodes Async sur Socket, TcpClient ou TcpListener pour créer un serveur évolutif en C #?
  • Les nouvelles méthodes asynchrones exploitent-elles les ports d’achèvement des E/S?
  • Rouler votre propre écouteur Socket est-il plus efficace, ou les classes TcpListener/TcpClient sont-elles plutôt bonnes maintenant?

EDIT: Questions supplémentaires.

23
Ben Lesh

Quelle est la meilleure façon d'utiliser les nouvelles méthodes Async sur Socket, TcpClient ou TcpListener pour créer un serveur évolutif en C #?

Il n'y a pas de nouvelle méthode async sur Socket; les méthodes nommées *Async sur Socket constituent un ensemble spécial d'API permettant de réduire l'utilisation de la mémoire. TcpClient et TcpListener ont obtenu de nouvelles méthodes async.

Si vous voulez la meilleure évolutivité, vous feriez probablement mieux d'utiliser les serveurs personnalisés de Stephen Toub pour Socket . Si vous voulez utiliser le code le plus facile, vous feriez probablement mieux d'utiliser TcpClient et TcpListener.

Les nouvelles méthodes asynchrones exploitent-elles les ports d’achèvement des E/S?

Oui, comme la plupart des autres API asynchrones de la BCL. Autant que je sache, la classe Stream est la seule à ne pas utiliser le protocole IOCP; Toutes les autres méthodes *Begin/*End/*Async utilisent le protocole IOCP.

Rouler votre propre écouteur Socket est-il plus efficace ou les classes TcpListener/TcpClient sont-elles plutôt bonnes maintenant?

Les cours sont assez bons comme ils sont. Stephen Toub a un blog post qui est un peu plus efficace en termes d'utilisation de la mémoire.

10
Stephen Cleary

Avec .net4.5, vous pouvez utiliser le mot clé async/wait pour construire le serveur TCP. Voici un exemple de code: async wait tcp server

Il peut accepter plus de 10 000 connexions.  tcp server

0
Jianchen Ding