socket simple async c# .net sockets async-await

simple - ¿Escribir un servidor TCP/IP altamente escalable en C#5 con el patrón async/await?



tcp ip asynchronous communication c# (2)

Tengo la tarea de diseñar un servidor TCP / IP bastante simple que debe aceptar conexiones de múltiples clientes. Necesita estar escrito en C #, y estoy usando .NET 4.5. Dicho esto, no estoy seguro de cuál es el "estado del arte" actual para la escalabilidad de servidor / cliente TCP / IP en .NET 4.5.

Vi esta publicación: Cómo escribir un servidor basado en Tcp / Ip escalable . Pero eso se relaciona con .NET 2.0 y 3.5 y no menciona el patrón async / await.

Soy capaz de escribir un servidor de la "vieja manera" ... pero quiero saber cuál es la "nueva forma".

  • ¿Cuál es la mejor manera de utilizar los nuevos métodos Async en Socket, TcpClient o TcpListener para crear un servidor escalable en C #?
  • ¿Los nuevos métodos Async aprovechan los puertos de finalización de E / S?
  • ¿Está haciendo más eficiente su propio oyente Socket, o las clases TcpListener / TcpClient son bastante buenas ahora?

EDIT: preguntas adicionales.


¿Cuál es la mejor manera de utilizar los nuevos métodos Async en Socket, TcpClient o TcpListener para crear un servidor escalable en C #?

No hay ningún método async nuevo en Socket ; los métodos llamados *Async en Socket son un conjunto especial de API para reducir el uso de memoria. TcpClient y TcpListener obtuvieron algunos nuevos métodos async .

Si desea la mejor escalabilidad, probablemente sea mejor utilizar blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx . Si desea el código más fácil, probablemente sea mejor que use TcpClient y TcpListener .

¿Los nuevos métodos Async aprovechan los puertos de finalización de E / S?

Sí, al igual que la mayoría de las otras API asíncronas en el BCL. AFAIK, la clase Stream es la única que posiblemente no pueda usar el IOCP; todos los demás *Begin / *End / *Async métodos asíncronos usan el IOCP.

¿Está haciendo más eficiente su propio oyente Socket, o las clases TcpListener / TcpClient son bastante buenas ahora?

Las clases son bastante buenas como son. Stephen Toub tiene una blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx que es un poco más eficiente en términos de uso de memoria.


Con .net4.5 puede usar la palabra clave async / await para construir el servidor tcp. Aquí está el código de ejemplo. async await tcp server

Puede aceptar más de 10K conexiones.