Servidor web + Cliente no-ip [Ethenet W5100 + Arduino Mega 2560]

Luego de investigar bastante en Internet... logre llegar a esto, que quiero compartir con todos ustedes.

Ademas preguntar como hacer que la Ethernet shield se conecte a router si se llegase a perder la conexión,...

hace poco me sucedió que alguien apago el router, lo encendió, y la Ethernet shield no logro recolectarse....

expongo el codigo completo, esta basado en el ejemplo "WebClienteRepeating" + los ejemplos que esta aqui Ejemplo para conectar a no-ip foro oficial ingles + el cliente web, de otra pagina (no recuerdo cual)

//----------------------------------
// Servidor web + cliente No-Ip
//----------------------------------

#include <SPI.h>
#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192, 168, 1, 50);

// fill in your Domain Name Server address here:
IPAddress myDns(192, 168, 1, 1);

// initialize the library instance:
EthernetClient client;
EthernetServer servidor(888);
//----------------------------------------------------------Servidor
int PIN_LED = 12;
String readString = String(30); //lee los caracteres de una secuencia en una cadena. ***no entiendo***
//Los strings se representan como arrays de caracteres (tipo char)
String state = String(3); //****tampoco entiendo****
//-----------------------------------------------------------//
unsigned long lastConnectionTime = 0;             // última vez que se conecta al servidor, en milisegundos
const unsigned long postingInterval = 300L * 1000L; // Tiempo entre actualizacion, en  milisegundos
// La "L" es necesaria para usar numeros de tipo Long
//----------------------------------------------------------------------------
void setup() {
  // iniciar puerto serial:
  Serial.begin(9600);
  // dar al modulo ethernet tiempo para arrancar:
  delay(3000);
  // iniciar la conexion ethernet usando ip y dns del DHCP:
  Ethernet.begin(mac, ip, myDns);
  // print the Ethernet board/shield's IP address:
  Serial.print("direccion IP Arduino: ");
  Serial.println(Ethernet.localIP());
  if (Ethernet.begin(mac) == 0) {
    Serial.println("fallo conexion Ethernet usando DHCP");
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
  }
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);
  state = "OFF";
}
//---------------------------------------------------------------------------
void loop() {
  // si hay datos entrantes de la conexión a la red.
  // enviarlo por el puerto serie. Esto es para la depuración
  // solo para ese proposito:
  if (client.available()) {
    char c = client.read();
    Serial.write(c);
  }
  // si han transcurrido diez segundos desde su última conexión,
  // Luego conecte de nuevo y enviar datos:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }
//----------------------------------------------------------------------------
//---------------------Servidor-----------------------------------------------
//----------------------------------------------------------------------------
//EthernetClient Crea un cliente que se puede conectar a 
    //una dirección específica de Internet IP
  EthernetClient cliente= servidor.available(); 
  if(cliente) {
      boolean lineaenblanco=true; //****no entiendo*****
      while(cliente.connected()) {
              if(cliente.available()) {
              char c=cliente.read(); 
                if(readString.length()<30) {
                  readString.concat(c);
                  //Cliente conectado
                  //Leemos petición HTTP caracter a caracter
                  //Almacenar los caracteres en la variable readString
                  } 
              if(c=='\n' && lineaenblanco) //Si la petición HTTP ha finalizado 
                  {
                  int LED = readString.indexOf("LED="); 
                    if(readString.substring(LED,LED+5)=="LED=T") {
                      digitalWrite(PIN_LED,LOW);
                      state="ON"; } 
                    else if (readString.substring(LED,LED+5)=="LED=F") {
                      digitalWrite(PIN_LED,HIGH); 
                      state="OFF";
                      }
                  //Cabecera HTTP estándar
                  cliente.println("HTTP/1.1 200 OK"); 
                  cliente.println("Content-Type: text/html"); 
                  cliente.println(); //Página Web en HTML 
                  cliente.println("<html>"); 
                  cliente.println("<head>"); 
                  cliente.println("<title>LAMPARA ON/OFF</title>"); 
                  cliente.println("</head>");
                  cliente.println("<body width=100% height=100%>"); 
                  cliente.println("<center>"); 
                  cliente.println("<h1>LAMPARA ON/OFF</h1>");
                  cliente.print("

"); 
                  cliente.print("Estado de la lampara: "); 
                  cliente.print(state); 
                  cliente.print("



"); 
                  cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>"); 
                  cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>"); 
                  cliente.println("</center>"); 
                  cliente.println("</body>"); 
                  cliente.println("</html>"); 
                  cliente.stop();
                  //Cierro conexión con el cliente 
                  readString="";
                  }
              }
          }
      }
  }
//----------------------------------------------------------------------------
//--------este método hace una conexión HTTP con el servidor:-----------------
//----------------------------------------------------------------------------
void httpRequest() {
  // cerrar cualquier conexión antes de enviar una nueva solicitud.
  // Esto liberará la toma del escudo WiFi
  client.stop();

  // si hay una conexión con éxito:
  if (client.connect("dynupdate.no-ip.com", 80)) {
    Serial.println();
    Serial.println();
    Serial.println(">>>>>connectado a no-ip<<<<<");
    // Make a HTTP request:
    //replace yourhost.no-ip.org with your no-ip hostname
    client.println("GET /nic/update?hostname=Tu Dominio de no-ip HTTP/1.0");
    client.println("Host: dynupdate.no-ip.com");
    //encode your username:password (make sure colon is between username and password) 
    //to base64 at http://www.opinionatedgeek.com/dotnet/tools/base64encode/
    //and replace the string below after Basic with your encoded string
    //clear text username:password is not accepted
    //reemplazar Usuario@email.com:contraseña encriptados
    //la pagina de mas arriva sirve para tal caso
    client.println("Authorization: Basic Usuario@email.com:contraseña"); 
    client.println("User-Agent: Arduino Sketch/1.0 user@host.com");
    client.println();
    // tenga en cuenta el momento en que se realizó la conexión:
    lastConnectionTime = millis();
  }
  else {
    // Si no se Logra hacer Una Conexión::
    Serial.println("++++++++conneccion fallida a no-ip+++++++++");
  }
 
}

intente ordenarlo lo mas que pude, expuse de igual forma como configurar para agregar sus datos y conectarse al servicio de no-ip

espero me puedan ayudar.