Problema com W5100 Ethernet

Para implementar o "Keep alive", deve alterar a biblioteca do W5100, que normalmente fica na pasta:

"C:\Program Files (x86)\Arduino\libraries\Ethernet\src"

No arquivo "EthernetServer.h" adicione na classe EthernetServer o protótipo do método:

static void keepAlive(uint32_t interval = 5000);

E no arquivo "EthernetServer.cpp", adicione a definição:

void EthernetServer::keepAlive(uint32_t interval){
	
	static uint32_t lastKeepAlive = 0;
	
	if (millis() - lastKeepAlive > interval) {
		lastKeepAlive = millis();

		for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
			EthernetClient client(sock);

			if (client.status() == SnSR::ESTABLISHED) {
				W5100.execCmdSn(sock, Sock_SEND_KEEP);
			}
		}
	}
}

No arquivo "Ethernet.cpp", dentro no método:

int EthernetClass::begin(uint8_t *mac_address, unsigned long timeout, unsigned long responseTimeout)

acrescente:

// Configurate timeout = 3,22 seconds
  W5100.setRetransmissionTime(512); //miliseconds * 10
  W5100.setRetransmissionCount(5);

Os três arquivos alterados estão em anexo para facilitar.

No seu código, normalmente no loop(), adicione antes de:

EthernetClient client = server.available();

A chamada do método:

server.keepAlive();

Em meus testes, o W5100 fecha as conexões travadas em dois momentos: quando falha ao enviar algum dado e usando o keep alive.
O problema do keep alive é que se você transmitir algo para os clientes logo após o invocar, o keep alive é "anulado", então são necessário testes.

Ethernet.cpp (3.93 KB)

EthernetServer.cpp (2.17 KB)

EthernetServer.h (443 Bytes)