Go Down

Topic: Accettare più connessioni in ingresso su server ethernet (Read 11762 times) previous topic - next topic

Janos

Perché la server.available è fatta così:

Code: [Select]
EthernetClient EthernetServer::available()
{
  accept();

  for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
    EthernetClient client(sock);
    if (EthernetClass::_server_port[sock] == _port &&
        (client.status() == SnSR::ESTABLISHED ||
         client.status() == SnSR::CLOSE_WAIT)) {
      if (client.available()) {
        // XXX: don't always pick the lowest numbered socket.
        return client;
      }
    }
  }

  return EthernetClient(MAX_SOCK_NUM);
}


Ovvero lui va a vedere su tutti i socket se è disponibile una connessione in ingresso e ritorna un oggetto client che punta alla prima che trova, quindi se ci sono più connessioni in ingresso ti è impossibile gestire la seconda connessione. Se esegui questo codice:

Code: [Select]
Ethernet client1 = server.available();
Ethernet client2 = server.available();
Ethernet client3 = server.available();
Ethernet client4 = server.available();


In realtà tutti i 4 gli oggetti client lavorano sullo stesso socket...

pablos71

#31
Mar 15, 2013, 12:23 pm Last Edit: Mar 15, 2013, 12:35 pm by pablos Reason: 1
si ok, ma i clients che si collegano al server si identificano tipo

pippo#messaggio
piero#messaggio
gino#messaggio
ugo#messaggio

non posso smistarli lo stesso sul server?


Mmmm forse ho capito, tu non vuoi tanto separare le connessioni in entrata, ma indirizzare le risposte solo al destinatario, anzichè spedirlo a tutti, separando le connessioni in entrata spedisci solo la risposta a chi ti ha fatto la richiesta .... una cosa così intendi?  
Se è così mi sembra che non sia più il principio fondamentale di un bus
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Janos

Esatto. Se volessi scrivere un messaggio a tutti i client connessi c'è l'apposita funzione server.print() (http://arduino.cc/en/Reference/ServerPrint). La client.print() (http://arduino.cc/en/Reference/ClientPrint), invece, risponde solo al client in questione, ma se non c'è un modo per separare i vari client è inutile...

lestofante

più in particolare usando il seguente codice si ottiene SEMPRE il primo client connesso:

Code: [Select]
Ethernet client1 = server.available();
Ethernet client2 = server.available();
Ethernet client3 = server.available();
Ethernet client4 = server.available();



per ottenerli tutti, invece, bisogna fare come il seguente codice SPERANDO che in questo momento NESSUNO stia scrivendo (manca il check che clientX sia valido):

Code: [Select]
Ethernet client1 = server.available();
while(client1.available()){
  client1.read();//svuota il buffer
}
Ethernet client2 = server.available();
while(client2.available()){
  client2.read();//svuota il buffer
}
Ethernet client3 = server.available();
while(client3.available()){
  client3.read();//svuota il buffer
}
Ethernet client4 = server.available();
while(client4.available()){
  client4.read();//svuota il buffer
}
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

#34
Mar 15, 2013, 01:21 pm Last Edit: Mar 15, 2013, 01:38 pm by Janos Reason: 1
Lesto, ho capito ora cosa intendevi per funzione che controlla il socket successivo... Vedo di buttare giù qualcosa e poi lo pubblico.

EDIT:
Non è così semplice, lascio perdere. Dovrei farmi un array di flag per sapere se una connessione è già attiva, nel qual caso deve essere saltata...

lestofante


Si si, quello che ho fatto io è un overload della funzione esistete, non ho modificato quella che gia c'è...  ;)


come scritto sulla issue questa modifica di scegliere i socket ha il problema dell'overflow dell'array.

Ora che ci penso, in oltre esporrebbe l'utente all'idea di credere che al numero 1 ci sia sempre lo stesso client (che invece, se chiuso, può essere rimpiazzato da un'altro), e infine si crea e distrugge spesso l'oggetto EthernetClient, cosa che non mi piace :)

preferisco l'idea di un metodo "getNextClient()" che lavora con la storia dei flag (a livello Socket, a questo punto), che restituisce un client una e una sola volta.

Così l'utente si fa un bell'array di client, quando necessarrio distrugge uno vecchio per fare posto ad uno nuovo, etc..

Infatti se io volessi fare un server che "parla per primo" (es. un server mail deve rispondere per primo con un messaggio HELO) non puoi, perchè se usi la server.print scrivi anche agli altri client che magari sono in altre fasi della comunicazione (e quindi rompoendo lo standard), e la available NON restituirà mail il cliecnt in quanto client.available() è sempre falso!
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

#36
Mar 15, 2013, 01:42 pm Last Edit: Mar 15, 2013, 01:44 pm by Janos Reason: 1
La faranno gli sviluppatori una getNextClient appropriata, per il mio utilizzo va benissimo la available(socket). Comunque perché dici che c'è il rischio di andare in overflow? Ho messo il controllo:

Code: [Select]
EthernetClient EthernetServer::available(uint8_t socket)
{
 accept(socket);

 if (socket < MAX_SOCK_NUM) {
   ...
   ...
 }

 return EthernetClient(MAX_SOCK_NUM);
}


EDIT: Forse è meglio mettere anche a accept(socket) dentro l'IF

lestofante

Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

pablos71

Fatti restituire gli ip di chi ti fa la richiesta e spedisci i pacchetti agli slave sempre tramite ip.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

lestofante

eeeek no!

esempio: per fare i test io farei partire 2 telent dal mio PC. risulato: casino! MAI fidarsi del puro ip, tutta le rete FastWeb + reti aziendali + 99%dei router NAT mostrano l'IP della NAT/Gateway...
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

@lesto
Piccolo OT: come terminale TCP (sia server che client), UDP e seriale io uso un programma che si chiama Hercules, è fantastico... =) Ti consiglio di dargli un'occhiata...
http://www.hw-group.com/products/hercules/index_en.html

lestofante

segui il mio link sotto e avrai un sacco di roba in Java per giocare allegramente... c'è persino un programma che fa darver TCP e mette i client in comunicazione con la seriale :)
l'ho usato per sharare le analisi dei dati che mi arrivavano via seriale con un mio amico, ognuno da casa sua con il suo bel client, e il mio PC che faceva da server (non avevo la eth shield)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

pablos71

#42
Mar 15, 2013, 03:38 pm Last Edit: Mar 15, 2013, 03:49 pm by pablos Reason: 1

eeeek no!

esempio: per fare i test io farei partire 2 telent dal mio PC. risulato: casino! MAI fidarsi del puro ip, tutta le rete FastWeb + reti aziendali + 99%dei router NAT mostrano l'IP della NAT/Gateway...


Ma sta facendo una rete a stella in lan locale, il master e gli slave si trovano in rete locale, non credo sparsi per il mondo ... sulla rete fastweb ormai hanno tutti un ip pubblico statico
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

lestofante

ma la libreria deve essere corretta per tutti, e visto che il problema è farsi restituire tutti i client, il come suddividerli è un problema secondario, senza contare che tutti i dati necessari alla suddivicione sono in Socket  :smiley-mr-green:
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up