He visto muchos recursos aquí en SO sobre Sockets. Creo que ninguno de ellos cubrió los detalles que yo quería saber. En mi aplicación, el servidor hace todo el procesamiento y envía actualizaciones periódicas a los clientes.Introducción a la programación de socket en C# - Mejores prácticas
La intención de esta publicación es cubrir todas las ideas básicas requeridas al desarrollar una aplicación de socket y analizar las mejores prácticas. Estas son las cosas básicas que verá con casi todas las aplicaciones basadas en socket.
1 - Encuadernación y la escucha en un socket
estoy usando el siguiente código. Funciona bien en mi máquina. ¿Debo ocuparme de otra cosa cuando implemente esto en un servidor real?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
2 - Recepción de datos
he utilizado una matriz de bytes de tamaño 255. Entonces, cuando recibo datos de más de 255 bytes, necesito llamar al método de recepción hasta que obtenga la información completa, ¿verdad? Una vez que obtuve la información completa, necesito anexar todos los bytes recibidos hasta ahora para obtener el mensaje completo. ¿Es eso correcto? ¿O hay un mejor enfoque?
3 - El envío de datos y especificar la longitud de datos
Puesto que no hay forma en TCP para encontrar la longitud del mensaje para recibir, tengo la intención de sumar la longitud del mensaje. Este será el primer byte del paquete. De modo que los sistemas del cliente saben cuántos datos hay disponibles para leer.
¿Algún otro enfoque mejor?
4 - Cerrando el cliente
Cuando el cliente está cerrado, se enviará un mensaje al servidor que indica la estrecha. El servidor eliminará los detalles del cliente de su lista de clientes. A continuación se muestra el código utilizado en el lado del cliente para desconectar el zócalo (no se muestra la parte de mensajes).
client.Shutdown(SocketShutdown.Both);
client.Close();
¿Alguna sugerencia o problema?
5 - Cerrando el servidor
servidor envía un mensaje a todos los clientes que indican el cierre. Cada cliente desconectará el socket cuando reciba este mensaje. Los clientes enviarán el mensaje de cierre al servidor y lo cerrarán. Una vez que el servidor recibe un mensaje de cierre de todos los clientes, desconecta el socket y deja de escuchar. Llame al Elimine en cada socket de cliente para liberar los recursos. ¿Es ese el enfoque correcto?
6 - desconexiones cliente desconocidos
A veces, un cliente puede desconectar sin informar al servidor. Mi plan para manejar esto es: cuando el servidor envía mensajes a todos los clientes, verifique el estado del socket. Si no está conectado, elimine ese cliente de la lista de clientes y cierre el socket para ese cliente.
¡Cualquier ayuda sería genial!
he tenido problemas con la Dirección IP de escucha en alguna versión anterior de Windows. Uso de IPAddress ipAddress = new IPAddress (nuevo byte [] {0, 0, 0, 0}); parece ser lo mejor para mi! – clamchoda