Uno de los componentes básicos de las aplicaciones de hoy en día son los sockets, que permiten enviar y recibir datos a través de redes TCP/IP, es decir, permiten que nuestra aplicación se comunique con el mundo que la rodea. Veremos cómo inicializar, finalizar y utilizar éstos importantísimos elementos:
Inicializar un socket
Para inicializar un socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):
// Basta con crear el objeto especificando su configuración con las
// enumeraciones AddressFamily, SocketType y ProtocolType
Socket socket = new Socket
(
AddressFamily.InterNetwork, // IPv4
SocketType.Stream, // Basado en streams
ProtocolType.Tcp // TCP
);
Recibir datos del socket
Para recibir datos del socket tendremos que asociar el socket a un puerto (detallaré cada elemento con los comentarios del código fuente):
// Determinamos el punto final al que llegarán las peticiones
// y nos ponemos a escuchar
socket.Bind(new IPEndPoint(IPAddress.Any, Int32.Parse(textBoxPuertoEscucha.Text)));
socket.Listen(5); // Número máximo de peticiones en cola
Luego, para recibir en si, tendremos que usar un código como éste:
// Esperamos una conexión entrante
while (!socket.Poll(socket.ReceiveTimeout, SelectMode.SelectRead))
{
// Aún no ha llegado, haremos lo que sea necesario aquí
// ...
}
// Aceptamos la conexión
Socket cliente = socket.Accept();
if (cliente != null)
{
// Recibimos datos
try
{
int numLeidos = cliente.Receive(buffer, 0, 256, SocketFlags.None);
recibido += ASCIIEncoding.ASCII.GetString(buffer, 0, numLeidos);
}
catch (Exception ee)
{
// Algo ha sucedido...
}
// Registramos lo recibido
if (recibido != "")
{
// Procesamos aquí lo recibido como sea necesario
// ...
}
}
Enviar datos por el socket
Para enviar datos por el socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):
// Creamos un socket de envío
Socket socketEnvio = new Socket
(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp
);
// Conectamos a una IP y un puerto concreto
IPAddress[] direcciones = Dns.GetHostEntry("SERVIDOR").AddressList;
IPAddress direccionRemota = null;
foreach (IPAddress d in direcciones)
{
if (d.AddressFamily == AddressFamily.InterNetwork)
{
direccionRemota = d;
}
}
socketEnvio.Connect(new IPEndPoint(direccionRemota, Int32.Parse("PUERTO")));
// Enviamos los datos
socketEnvio.Send(System.Text.Encoding.ASCII.GetBytes(paqueteAEnviar));
// Desconectamos
socketEnvio.Close();
Finalizar un socket
Para finalizar un socket tendremos que usar un código como éste (detallaré cada elemento con los comentarios del código fuente):
// Desconectamos
socket.Close();
Conclusión
Hemos visto un componente muy importante que nos abre un mundo de posibilidades. Una pieza más para el puzzle que son nuestras aplicaciones
¡Pronto más!