Go Down

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

Janos

Sono giorni che cerco ma non riesco a venirne fuori. In pratica, come si fa ad accettare connessioni simultanee da più client sulla stessa porta ed a gestirle separatamente?

lestofante

devi fare un array do oggetti Client, e mano a mano che li accetti li metti nell'array. Ovviamente nella prima posizione disponibile.

Mi pare che la eth shield al massimo regge 4 client.

Poi ogni loop per ogni client connesso esegui il classico codice che usi.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

Quindi una cosa simile a questa?

Code: [Select]
EthernetClient client[4];
EthernetServer server(502);

client[1] = server.available();
if (client[1]) //Client1 connesso
client[2] = server.available();
if (client[2]) //Client2 connesso
client[3] = server.available();
if (client[3]) //Client3 connesso
client[4] = server.available();
if (client[4]) //Client4 connesso

lestofante

che ne dici di:

Code: [Select]

#define NUMERO_CLIENT 4
EthernetClient client[NUMERO_CLIENT];
EthernetServer server(502);

void loop(){
EthernetClient temp = server.available();
for (i=0;i<NUMERO_CLIENT;i++){
   if ( null != client[i] || client[i]){ //Client1 connesso
       //elabora client, se disconnesso mettilo a null
   }else{
       //trovato un posto vuoto, usalo per il nuovo client!
       client[i] = temp;
       temp=server.available(); //accetta l'eventuale prossima connessione
   }
}
}

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

Janos

Ho fatto un ibrido:

Code: [Select]
for (int i=0;i<4;i++){
  if (!datiClient[i].connesso) {
    client[i] = MbServer.available();
    if (client[i]){
      datiClient[i].connesso = true;
      #ifdef MbServerDebug
        Serial.print("Client ");
        Serial.print(i+1);
        Serial.println(" connesso");
      #endif
    };
  };
};


Però come un client si collega sulla seriale vedo
Code: [Select]
Client 1 connesso
Client 2 connesso
Client 3 connesso
Client 4 connesso


Perché?

Janos

Guarda, per scrupolo ho preso il tuo codice e l'ho reso compilabile:

Code: [Select]
#define NUMERO_CLIENT 4

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

EthernetClient client[NUMERO_CLIENT];
EthernetServer server(502);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0xFB };
IPAddress ip(10,10,10,157);

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Ethernet.begin(mac, ip);
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  Serial.begin(115200);
};

void loop(){
EthernetClient temp = server.available();
for (int i=0;i<NUMERO_CLIENT;i++){
   if ( NULL != client[i] || client[i]){
       while (client[i].available()) {
          Serial.print(client[i].read());
       };
       if (!client[i].connected()) client[i] = NULL;
   }else{
       //trovato un posto vuoto, usalo per il nuovo client!
       client[i] = temp;
       temp=server.available(); //accetta l'eventuale prossima connessione
       if (temp) {
         Serial.print("Client ");
         Serial.print(i+1);
         Serial.println(" connesso");
       };
   }
}
}


Se un client mi invia semplicemente "ciao" sulla seriale leggo questo:

Code: [Select]
Client 4 connesso
Client 1 connesso
Client 2 connesso
Client 3 connesso
Client 4 connesso
9910597111

lestofante

uhmm c'è da debuggare con calma che diavolo succede
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

Altra prova:

Code: [Select]
#define NUMERO_CLIENT 4

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

EthernetClient client1, client2;
EthernetServer server1(502);
EthernetServer server2(502);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0xFB };
IPAddress ip(10,10,10,157);

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Ethernet.begin(mac, ip);
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  Serial.begin(115200);
  server1.begin();
  server2.begin();
};

boolean server1Connesso;
boolean server2Connesso;

void loop(){
  if (!server1Connesso) {
    EthernetClient client1 = server1.available();
    if (client1) {
      server1Connesso = true;
      Serial.println("Server 1 connesso");
    }
  }
  if (!server2Connesso) {
    EthernetClient client2 = server2.available();
    if (client2) {
      server2Connesso = true;
      Serial.println("Server 2 connesso");
    }
  }
}


Risultato:

Code: [Select]
Client 1 connesso
Client 2 connesso


Provo a leggere qua: http://arduino.cc/forum/index.php/topic,36328.15.html

lestofante

ma scusa non mi torna, così hai due socket sulla stessa porta... bho è controintuitivo
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino


lestofante

questo:

Code: [Select]
EthernetServer server1(502);
EthernetServer server2(502);


non mi convince, ma se hai provato una doppia telnettata contemporanea e tutto funziona...
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

No che non funziona, basta che un client si colleghi e Arduino li vede collegati tutti.....  =( Ovvero, funziona ma male.

Sempre più un mistero: ho inserito nell'EthernetClient.cpp una funzione che mi torna il socket:

Code: [Select]
uint8_t getSocket(){
    return _sock;
  }


E ho provato questo:

Code: [Select]
#define NUMERO_CLIENT 4

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

EthernetClient client1, client2;
EthernetServer server1(502);
//EthernetServer server2(502);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0xFB };
IPAddress ip(10,10,10,157);

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Ethernet.begin(mac, ip);
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  Serial.begin(115200);
  server1.begin();
  //server2.begin();
};

boolean server1Connesso;
boolean server2Connesso;

void loop(){
  if (!server1Connesso) {
    EthernetClient client1 = server1.available();
    if (client1 && (!server2Connesso || client1.getSocket() != client2.getSocket())) {
      Serial.println(client1.getSocket());
      Serial.println(client2.getSocket());
      server1Connesso = true;
      Serial.println("Server 1 connesso");
    }
  }
  if (!server2Connesso) {
    EthernetClient client2 = server1.available();
    if (client2 && (!server1Connesso || (client1.getSocket() != client2.getSocket()))) {
      Serial.println(client1.getSocket());
      Serial.println(client2.getSocket());
      server2Connesso = true;
      Serial.println("Server 2 connesso");
    }
  }
 
  if (server1Connesso) client2.println("Scrivo sull'1");
  if (server2Connesso) client2.println("Scrivo sul 2");
}


Il risultato, quando un client invia qualcosa, è questo:

Code: [Select]
4
0
Server 2 connesso
0
4
Server 1 connesso


Sto uscendo di matto.....  =( =( =( =( =( =( =( =( =( =(

lestofante

cavoli mi sa che la ho un ethernet a casa... se solo avessi tempo mannaggia!
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

Forse ci sono, FORSE!!!!!!

Code: [Select]
#define NUMERO_CLIENT 4

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

EthernetClient client1, client2;
EthernetServer server1(502);
EthernetServer server2(502);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0xFB };
IPAddress ip(10,10,10,157);

void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Ethernet.begin(mac, ip);
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  Serial.begin(115200);
  server1.begin();
  server2.begin();
};

boolean server1Connesso;
boolean server2Connesso;
boolean temp;

void loop(){
  if (!server1Connesso) {
    client1 = server1.available();
    if (client1 && (!server2Connesso || client1.getSocket() != client2.getSocket())) {
      Serial.println(client1.getSocket());
      Serial.println(client2.getSocket());
      server1Connesso = true;
      Serial.println("Server 1 connesso");
    }
  }
  if (!server2Connesso) {
    client2 = server2.available();
    if (client2 && (!server1Connesso || (client1.getSocket() != client2.getSocket()))) {
      Serial.println(client1.getSocket());
      Serial.println(client2.getSocket());
      server2Connesso = true;
      Serial.println("Server 2 connesso");
    }
  }
 
  if ((server2Connesso || server1Connesso) && !temp) {
    client1.println("Scrivo sull'1");
    client2.println("Scrivo sull'2");
    temp = true;
  }
}


Risultato sulla seriale:
Code: [Select]
4
0
Server 2 connesso


Risposta sulla TCP:
Code: [Select]
Scrivo sull'2

Janos

Scherzavo....  =( =( =( =( UFFA!!!

Code: [Select]
...
...
...
if ((server2Connesso || server1Connesso) && temp < 10) {
   client1.println("Scrivo sull'1");
   client2.println("Scrivo sull'2");
   temp++;
 }


Sulla TCP ho:
Code: [Select]
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2
Scrivo sull'1
Scrivo sull'2


Lesto, sei la mia unica speranza....  =( =( =(

Go Up