Go Down

Topic: Ethernet ...ARP Cache e chiusura delle connessioni... (Read 661 times) previous topic - next topic

astroz78

Eccomi qui con un'altra delle mie fantastiche esternazioni esistenziali...sto Arduino lo sto sviscerando nel suo più intimo! :P

Ho due quesiti x sondare le vostre esperienze:

1 - ARP Cache
Un dispositivo che si connette su bus Ethernet (es. PC) si connette ad un altro dispositivo (es. altro PC) utilizzando l'indirizzo IP...ma a livello più basso del TCP/IP non funziona così...la comunicazione avviene su MAC Address. Quando il dispositivo che inizia la connessione ad un altro IP, in realtà esso manda per la prima volta un messaggio di broadcast x sapere a chi appartiene quell'indirizzo IP e la risposta è il MAC Address del destinatario...così che i due possano comunicare liberamente. Nei PC o nei dispositivi "potenti" viene gestita una ARP Cache così che il messaggio di Broadcast venga inviato una sola volta (il Broadcast è un messaggio negativo x la rete in quanto impegna tutte le porte di tutti i link che esistono nel network...quindi a cascata tutte le porte di tutti i switch esistenti nella LAN...xkè quell'IP può stare su qualsiasi porta di qualsiasi switch). Le volte successive il MAC Address viene preso dalla ARP Cache e così via...da una prova che ho fatto mi pare d'aver capito che Arduino e il suo Ethernet Shield non gestiscono tale ARP Cache e, quindi, ogni volta che si inizia una connessione ad un IP anche se esso è sempre lo stesso, viene sempre inviato il messaggio di Broadcast x fare il discover del MAC Address...se io devo fare una connessione molto frequente questo peggiora le performance di tutto il network...se poi gli Arduini a dover aprire/chiudere frequentemente una connessione verso un nodo server sono 6...il problema è moltiplicato 6...che ne sapete al proposito? Cioè è vero che non viene gestita la ARP Cache e quindi viene mandato sempre il Broadcast? Esiste un modo x bypassare questa "funzione" specificando il MAC Address del destinatario (magari qualche libreria Ethernet hackata)...


2 - Chiusura connessione
Arduino è client e si connette ad un server...nello specifico ad un Web Server...quindi su porta 80...apre la socket, manda un comando di GET di una pagina...nemmeno si cura della risposta (che flusho via) e chiude la connessione...quindi riepilogando:
Code: [Select]

  if (client.connect()) {
    client.println("GET /listener.php HTTP/1.0");
    client.println();
  }
  client.flush();
  client.stop();


Chiaramente ho estratto dal mio codice solo la quota parte di "comunicazione".

Il server è Apache e, come da specifiche, quando esso ha risposto è lui a chiudere la comunicazione...cioè a sbattere fuori il client. Quindi il metodo stop() tenta di chiudere una connessione in realtà già chiusa. Se andate a vedere il codice del metodo stop() esso se non riesce a chiudere, prova x 1 secondo poi chiude forzatamente...quel secondo è un dramma...mi blocca il superloop (nel quale vengono gestiti tutti gli altri servizi che non possono star fermi 1 secondo) e arrivederci...posto il codice specifico di stop():
Code: [Select]

  // attempt to close the connection gracefully (send a FIN to other side)
  disconnect(_sock);
  unsigned long start = millis();

  // wait a second for the connection to close
  while (status() != SnSR::CLOSED && millis() - start < 1000)
    delay(1);

  // if it hasn't closed, close it forcefully
  if (status() != SnSR::CLOSED)
    close(_sock);


Avete soluzioni in merito?

Ho già provato a omettere stop() supponendo che "tanto la connessione è già chiusa" peccato che Arduino non se ne accorge..quindi la 1° connessione và a buon fine e dalla 2° in poi no (xkè è già connesso in realtà)...infatti se testo la "client.connected()" risponde TRUE!!!!
OpenDomotica ...la domotica con Arduino - www.opendomotica.it

bigjohnson

Ciao,
non è che facendo
  client.flush();
  client.stop();
tra il flush e lo stop ti arrivano dei dati e non te ne accorgi?
prova con
do
{
    client.flush();
} while (client.available());
  client.stop();
così magari riesci a non avere dati nel buffer ethernet in attesa di lettura e il socket si chiude subito.

lesto

ARP Cache:

quale ethenet shield usi? se col wiznet, allora è colpa di quel chip e non credo che sia programmabile. Altrimenti è la shield che implemente gli stack a livello di libreria, e in quel caso dovrebbe essere fattibile modificare il comportamento.

Poi in realtà non so fino a che livello ISO/OSI viene gestito dal wiznet...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up