Pregunta

¿Podría alguien señalarme en la dirección correcta para aprender a hacer redes en C # /. net 3.5? Se aceptan ejemplos de código y explicaciones. Básicamente estoy buscando cómo hacer modelos asincrónicos / multiproceso servidor / cliente.

Estoy bastante cómodo con los conceptos básicos sobre cómo lograr esto en C ++ con WinSock, pero aunque toda mi investigación no parece comprender este concepto en C #.

Gracias por cualquier ayuda que pueda brindar :)

¿Fue útil?

Solución

Si WCF satisface sus necesidades, vale la pena mirarlo. ZeroC y existen otras bibliotecas alternativas de nivel superior. De lo contrario, hay varias formas diferentes de trabajar más cerca del nivel del zócalo si eso es lo que necesita.

TcpClient / UdpClient

Estos proporcionan una envoltura relativamente delgada alrededor de los zócalos subyacentes. Básicamente proporciona un flujo sobre el zócalo. Puede usar los métodos asíncronos en NetworkStream (BeginRead, etc.). No me gusta este ya que el contenedor no proporciona mucho y tiende a ser un poco más incómodo que usar el zócalo directamente.

Socket - Seleccione

Esto proporciona la clásica técnica Select para multiplexar múltiples IO de socket en un solo hilo. No recomendado por más tiempo.

Zócalo - Estilo APM

El modelo de programación asincrónico (AKA IAsyncResult, Begin / End Style) para sockets es la técnica principal para usar sockets de forma asincrónica. Y hay varias variantes. Básicamente, llama a un método asíncrono (por ejemplo, BeginReceive) y realiza una de las siguientes acciones:

  1. Encuesta para completar en el IAsyncResult devuelto (apenas utilizado).
  2. Utilice WaitHandle de IAsyncResult para esperar a que se complete el método.
  3. Pase el método BeginXXX un método de devolución de llamada que se ejecutará cuando se complete el método.

La mejor manera es # 3, ya que suele ser la más conveniente. En caso de duda, utilice este método.

Algunos enlaces:

.NET 3.5 Sockets de alto rendimiento

.NET 3.5 introdujo un nuevo modelo para sockets asíncronos que usa eventos. Utiliza el "simplificado" modelo asíncrono (por ejemplo, Socket.SendAsync). En lugar de devolver una llamada, se suscribe a un evento para su finalización y en lugar de un IAsyncResult, obtiene SocketAsyncEventArgs. La idea es que puede reutilizar SocketAsyncEventArgs y preasignar memoria para socket IO. En escenarios de alto rendimiento, esto puede ser mucho más eficiente que usar el estilo APM. Además, si preasigna la memoria, obtendrá una huella de memoria estable, recolección de basura reducida, agujeros de memoria por fijación, etc. Tenga en cuenta que preocuparse por esto solo debe tenerse en cuenta en los escenarios de más alto rendimiento.

Resumen

Para la mayoría de los casos, use el método de devolución de llamada del estilo APM a menos que prefiera el estilo del método SocketAsyncEventArgs / Async. Si ha utilizado CompletionPorts en WinSock, debe saber que ambos métodos usan CompletionPorts debajo del capó.

Otros consejos

En .NET 3.5 world definitivamente debería aprender Windows Communication Foundation - .NET framework para redes.

Enlace útil:

Operaciones síncronas y asíncronas (en WCF)

Puede encontrar información útil de WCF en las publicaciones de exploración de StackOverflow etiquetadas con la etiqueta WCF

Depende de en qué te quieras enfocar.

Si desea centrarse en la funcionalidad y dejar la fontanería en el marco, comience con Windows Communication Foundation.

Si está buscando construir su propia tubería, entonces use la clase System.Net.Sockets.Socket .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top