Buenas, en este post hare un pequeño ejemplo de la comunicacion sin conexion usando el protocoloo UDP por el cual puedo enviar datagramas en la red sin necesidad de haber establecido una conexion al contrario de el otro protocolo TCP.
¿Que puertos utilizamos?
Desde Wikipedia podemos obtener esto:
Puertos
UDP utiliza puertos para permitir la comunicación entre aplicaciones. El campo de puerto tiene una longitud de 16 bits, por lo que el rango de valores válidos va de 0 a 65.535. El puerto 0 está reservado, pero es un valor permitido como puerto origen si el proceso emisor no espera recibir mensajes como respuesta.
Los puertos 1 a 1023 se llaman puertos "bien conocidos" y en sistemas operativos tipo Unix enlazar con uno de estos puertos requiere acceso como superusuario.
Los puertos 1024 a 49.151 son puertos registrados.
Los puertos 49.152 a 65.535 son puertos efímeros y son utilizados como puertos temporales, sobre todo por los clientes al comunicarse con los servidores.
¿Como hacer la conexion por medio del protocolo UDP?
Bueno suponiendo que han leido ya sobre UDP y datagramas y sockets en general empezare con el codigo, debido a intereses personales volvere a usar c# en este ejemplo, aunque como la mayoria saben no hay un cambio significativo de comprension para que lo pasen a Visual Basic.
Lo primero que haremos es crear una nueva solucion con el nombre que crean conveniente, luego agregar un proyecto de libreria de clases donde ira el siguiente codigo:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.NetworkInformation; //Necesaria para usar el NetworkInterface
using System.Net.Sockets; //Necesaria para usar el UDPClient, AddressFamily
using System.Net; //Necesaria para usar el IPEndPoint,IPAddress
namespace libDatagramas
{
public class clsPaquetes
{
//Declarando Variables
private string _MensajeTexto;
byte[] Mensaje = new byte[1024];
private NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
System.Net.Sockets.UdpClient Cliente = new System.Net.Sockets.UdpClient(11000,AddressFamily.InterNetwork);
//Propiedad para obtener el mensaje que envia
public string MensajeTexto
{
get { return _MensajeTexto; }
set { _MensajeTexto = value; }
}
//Este void sirve para enviar paquetes por medio de datagramas
public void MensajeParaEnviar()
{
//Obtengo los bytes debido a que el envio de paquetes por medio de datagrama es en bytes
Mensaje = Encoding.ASCII.GetBytes(_MensajeTexto);
//Establesco los puertos
System.Net.IPEndPoint ipEndPoint = new System.Net.IPEndPoint(ni[0].GetIPProperties().UnicastAddresses[0].Address, 11000);
//Envio el paquete por medio de datagramas
Cliente.Send(Mensaje, Mensaje.Length, ipEndPoint);
}
//Por medio de este void obtengo el paquete que he enviado anteriormente por medio de datagramas
public string ObtenerMensaje()
{
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 11000);
Mensaje = Cliente.Receive(ref sender);
//Obtengo el string debido a que el envio de paquetes por medio de datagrama es en bytes
string MensajeFinal = Encoding.ASCII.GetString(Mensaje);
//Retorno el mensaje obtenido
return MensajeFinal.ToString();
}
}
}
Bueno en el ultimo corchete termina la clase necesaria, ustedes pueden compilarla y utilizar el binario como una referencia para aplicarla en cualquier programa.
Bueno la interfaz es lo ultimo, y lo inico que se necesita seria 1 listbox donde aparece el mensaje recibido y un cuadro de texto donde se escribe el mensaje a enviar ademas de un boton para enviar el mensaje y uno para recibir.
El proposito de este ejemplo es aprender es por eso que todo esta en una sola pantalla, hay varias formas de recibir los mensajes sin necesidad de presionar el boton.
Lo que haremos es a la solucion anterior agregar un nuevo proyecto, y en este caso utilizaremos un proyecto de aplicacion windows.
1- Hacer la referencia a la libreria de clases creada anteriormente o si ya la compilaron a una DLL.
2- Escribir el codigo siguiente(con su nombre de proyecto, libreria etc…)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WinAppliDatagramas
{
public partial class frmDatagramas : Form
{
public frmDatagramas()
{
InitializeComponent();
}
//Instancia de la la clase paquetes
libDatagramas.clsPaquetes DataGramas = new libDatagramas.clsPaquetes();
//Boton para comprobar si hay algun mensaje
private void btnRecibirMensajes_Click(object
sender, EventArgs e)
{
string MensajeObtenido;
MensajeObtenido = DataGramas.ObtenerMensaje();
this.lstMensajesObtenidos.Items.Add(MensajeObtenido);
}
//Boton para enviar mensajes
private void btnEnviarMensaje_Click(object sender, EventArgs e)
{
//Envio el mensaje que hay en el textbox
DataGramas.MensajeTexto = this.txtMensajeParaEnviar.Text;
DataGramas.MensajeParaEnviar();
txtMensajeParaEnviar.Text = ""
}
}
}
Bueno eso es todo, si quieren descargar el proyecto que esta escrito en c# lo pueden hacer desde el area de descargas.
October 1st, 2008 at 9:03 pm
Hola .. muy bueno el proyecto
pero no lo encuentro en la zona de descargas :S
me podiras decir si es q lo sacaste o es solo q lo tengo q buscar mejor ?
gracias
UsandoOctober 2nd, 2008 at 12:33 pm
Disculpa, es que cuando me cambie de host hubo problemas… en la noche lo buscare y lo pondré.
UsandoOctober 8th, 2008 at 11:02 am
Hola Benjamín, oye me podrías decir en donde esta el área de descargas??.
Gracias.. =)
UsandoOctober 12th, 2008 at 8:33 am
Les pido disculpas, aun no encuentro el archivo.
UsandoOctober 12th, 2008 at 8:37 am
Graciela lamentablemente cuando me cambie a wordpress perdi la zona de descargas
Usando