Bueno de unas merecidas vacaciones y luego de una semana con bastantes cosas entretenidas que hacer en la oficina, es que hoy les traigo un nuevo ejemplo para poder enviar mensaje UDP de forma asincrónica utilizando C#.
Como es costumbre, primero vamos a partir con la explicación de por que el ejemplo. Bueno, la verdad es bastante simple. Un cliente requería automatizar una serie de acciones de acuerdo a información que recibía una Web X. Esta información debía gatillar acciones relacionadas con una Pbx y está a su vez requería (hasta el momento acciones manuales) que recargaran la información almacenada en la base de datos y las informara a la Pbx. Hasta ahí todo bien, el tema es que sería necesario contratar una persona para que esté cada 5 segundos realizando esta acción manual para que se fueran procesando las solicitudes de la Web (obviamente no es rentable para nadie). Producto de ésto pasamos a la segunda fase que era evaluar la automatización de dicha acción; Me fui a ver la API y tras un rato de hacer pruebas sin sentidos vi que no es posible accionarlo desde ahí (obviamente la Pbx no me iba a permitir de forma fácil acceder a todas las funciones). Tras encontrarme con la problemática decidir descender a la capa de red y realizar capturas de red para tratar de identificar que era lo que hacía el equipo cuando se realizaba dicha acción. Tras varias horas (créanme que fueran VARIAS) logre identificar que la instrucción viajaba por UDP, por lo que llegamos al meollo del asunto. (lo de las capturas y luego que hacer con el mensaje cifrado se verá en otra oportunidad si es que a alguien le interesa).
Con la introducción lista pasamos a nuestro ejemplo:
Lo primero es saber a quien le enviaremos el mensaje y a través de que puerto. Con estos datos podemos recuperar la IP del servidor UDP que recibirá el mensaje a resolviendo en nuestro caso la dirección. Luego crearemos el mensaje (voy a usar ASCII por que fue un parto identificar ésto en la captura y se me dio la gana!), lo enviaremos y finalmente verificaremos que el mensaje haya salido a la RED.
using System.Net.Sockets;
using System.Net;
using System.Threading;
public class UdpConnector
{
UdpClient u = new UdpClient();
//Resolvemos la dirección a través de su nombre
IPHostEntry heserver = Dns.GetHostEntry("SERVIDOR_UDP");
int endPort = 12345;
IPEndPoint endpoint = new IPEndPoint(heserver.AddressList[0], endPort);
public static bool messageSent = false;
string theASCII = ((char)3).ToString(); //este ASCII es un corazón, ya verán el sentido jeje
string message = "I " + theASCII + " you UDP";
Byte[] sendBytes = Encoding.ASCII.GetBytes(message); //guardamos los los bytes codificados en ASCII para nuestro caso
//Finalmente enviamos nuestro mensaje y llamamos a nuestro método de envío asincrónico.
u.BeginSend(sendBytes, sendBytes.Length, endpoint,
new AsyncCallback(sendAsync), u);
while (!messageSent) //esperamos la confirmación del envío
{
Thread.Sleep(100);
}
public static void sendAsync(IAsyncResult ar)
{
UdpClient u = (UdpClient)ar.AsyncState;
u.EndSend(ar);
//Finaliza el envío del mensaje.
messageSent = true;
}
}
Con lo anterior ya podemos enviar nuestros mensajes vía UDP a algún destino. Como tip o recomendación les comento que muchos de los mensajes que envían las aplicaciones por UDP suelen ir encriptados y codificados de forma distinta, y deben cerciorarse de que método será utilizado en el decoding del servidor para saber la estructura del mensaje a enviar cuando estos se pasan a bytes.
Ojala les sirva! Saludos y abrazos a todos y recuerden que la publicidad del blog es muy linda!
ByeZ!
No hay comentarios:
Publicar un comentario