Ethernet Shield não reconecta após roteador reiniciar

Olá uso um mega com o Ethernet shield ha um bom tempo e venho percebendo de vez em quando que após o modem reiniciar por falta de energia ou até mesmo quando o modem da operadora perde conexão e se restabelece o Arduíno as vezes não retorna de forma correta para ser acessado, sendo que preciso reiniciar ele para voltar a funcionar.

Não sei qual problema que pode gerar este erro, geralmente demora meses para ocorrer será que se implementar alguma forma de testar a conexão com algum ping e reiniciar o Arduíno ?

Pode o arduino não renovar o IP e o modem/router não aceitar algo com IP fixo nos portos.
Configurar o router para ter um IP fixo em determinado porto, resolve isso.

Outro problema pode ter a ver com o código.

Se o arduino estiver a ler do ethernet shield dependendo se está conectado em vez de ser dependente dos caracteres em buffer, o W5100 bloqueia e não deixa reutilizar o socket.

Sem mais info é impossível dar mais ajuda.

OK coloquei todo o código aqui, nas configurações de rede fiz apenas a regra nat na porta 7777 para o ip do Arduíno essa questão de buffer realmente desconheço, nó código usei como base o exemplo do próprio Arduíno o sketch "ETHERNET - WEBSERVER"

#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>
//#include <SD.h>




byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(7777);
IPAddress ip(10,0,0,120 );  

#include "DHT.h"
#define DHTPIN A12                              
#define DHTTYPE DHT11   
DHT dht(DHTPIN, DHTTYPE);
#define BAUD_RATE 9600
#define TERM_CHAR '\n'
#define BUF_LEN  30
byte sampledata=50;
int h; 
int t;
int i;
int count=0;
char c;
String readString = String(BUF_LEN); 


void setup()
{
  
  // disable Ethernet chip
  pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
  digitalWrite(10, HIGH);
  Serial.begin(9600);     
//********************************************************************************************
  
  
 
 
 // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
 
 
  Serial.begin(9600);
  Serial.println("Iniciando programa..");

  Serial.print(Ethernet.localIP());
  //server.begin();


}
void loop()
{
  
  

  
 

 //EthernetServer server(7777);//retorna com a porta 
 EthernetClient client = server.available();
  if(client)
  {
    boolean continua = true;
    String linha = "";

    while(client.connected())
    {
      if(client.available()){
        char c = client.read();
        linha.concat(c);

        if(c == '\n' && continua)
        {
          client.println("HTTP/1.1 200 OK");
          // IMPORTANTE, ISSO FAZ O ARDUINO RECEBER REQUISIÇÃO AJAX DE OUTRO SERVIDOR E NÃO APENAS LOCAL.
          client.println("Content-Type: text/javascript");
          client.println("Access-Control-Allow-Origin: *");
          client.println();          

          int iniciofrente = linha.indexOf("?");

          if(iniciofrente>-1){     //verifica se o comando veio
            iniciofrente     = iniciofrente+6; //pega o caractere seguinte
            int fimfrente    = iniciofrente+3; //esse comando espero 3 caracteres
            String acao    = linha.substring(iniciofrente,fimfrente);//recupero o valor do comando


            if      ( acao == "001"){ 
              digitalWrite(LUZ1, HIGH); 
                    if(currentMillis - previousMillis >= 500) {
                    previousMillis = currentMillis; 
                    lcd.setCursor(0,0);
                    lcd.print("Comando WEB     ");
                    lcd.setCursor(0,1);
                    lcd.print("Rele 1 ON       "); 
                    }
            } 
           


            client.print("dados({ sensor1 : ");
            client.print(t);
            client.print(", sensor2 :  ");
            client.print(h);

            client.print(",");  

            client.print(" LUZ1 : ");
            client.print(digitalRead(LUZ1));

            client.print(",");

            client.print(" LUZ2 : ");
            client.print(digitalRead(LUZ2));
            //client.print("})");

            client.print(",");

            client.print(" LUZ3 : ");
            client.print(digitalRead(LUZ3));

            client.print(",");


            client.print(" LUZ4 : ");
            client.print(digitalRead(LUZ4));

            client.print(",");


            client.print(" LUZ5 : ");
            client.print(digitalRead(LUZ5));

            client.print(",");


            client.print(" LUZ6 : ");
            client.print(digitalRead(LUZ6));

            client.print(",");



            client.print(" LUZ7 : ");
            client.print(digitalRead(LUZ7));

            client.print(",");



            client.print(" LUZ8 : ");
            client.print(digitalRead(LUZ8));

            client.print(",");


            client.print(" ALARME1 : ");
            client.print(alarme1);


            client.print(",");


            client.print(" ALARME2 : ");
            client.print(alarme2);
            client.print("})");


          }          
          break;
        }
        if(c == '\n') { 
          continua = true; 
        }
        else if (c != '\r') { 
          continua = false; 
        }
      }
    }
    delay(1);
    client.stop();
  }


  
}