// 
// Copyright 2016 Agencia Estatal de Administración Tibutaria
//
// Licencia con arreglo a la EUPL, Versión 1.1 o -en cuanto
// sean aprobadas por la Comisión Europea- versiones
// posteriores de la EUPL (la «Licencia»);
// Solo podrá usarse esta obra si se respeta la Licencia.
// Puede obtenerse una copia de la Licencia en:
//  
// https://joinup.ec.europa.eu/software/page/eupl
//  
// Salvo cuando lo exija la legislación aplicable o se acuerde
// por escrito, el programa distribuido con arreglo a la
// Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
// DE NINGÚN TIPO, ni expresasni implícitas.
//
// Véase la Licencia en el idioma concreto que rige los permisos y 
// limitaciones que establece la Licencia.
// 

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace ateneo.sockets
{
    public class SocketUDP
    {
        string nombreServidor;
        int puerto;
        UdpClient udp;

        public SocketUDP(string nombre, int puerto) {
            nombreServidor = nombre;
            this.puerto = puerto;
            try {
                udp = new UdpClient();
            } catch (Exception) {
                udp = null;
            }
        }

        public string buscarServidorEnLaRed(int timeOut) {
            try {
                System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
                string strMensaje = "buscaServidor";
                byte[] datagrama = encoding.GetBytes(strMensaje);
                udp.EnableBroadcast = true;
                IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, puerto);
                udp.Send(datagrama, datagrama.Length, ip);
                udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeOut);
                byte[] recibido = udp.Receive(ref ip);
                string resp = encoding.GetString(recibido);
                string[] partes = resp.Split(' ');
                if (partes.Length == 3 && partes[0]=="ServidorAteneo" && nombreServidor==partes[1]) {
                    return partes[2];
                }
            } catch (Exception) {}
            return "";
        }

        public void close() {
            udp.Close();
            udp = null;
        }
    }
}
