Accettare più connessioni in ingresso su server ethernet

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?

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.

Quindi una cosa simile a questa?

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

che ne dici di:

#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
   }
 }
}

Ho fatto un ibrido:

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

Client 1 connesso
Client 2 connesso
Client 3 connesso
Client 4 connesso

Perché?

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

#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:

Client 4 connesso
Client 1 connesso
Client 2 connesso
Client 3 connesso
Client 4 connesso
9910597111

uhmm c'è da debuggare con calma che diavolo succede

Altra prova:

#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:

Client 1 connesso
Client 2 connesso

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

ma scusa non mi torna, così hai due socket sulla stessa porta… bho è controintuitivo

Ovvero? Sto sbagliando qualcosa io?

questo:

EthernetServer server1(502);
EthernetServer server2(502);

non mi convince, ma se hai provato una doppia telnettata contemporanea e tutto funziona…

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:

uint8_t getSocket(){
    return _sock;
  }

E ho provato questo:

#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:

4
0
Server 2 connesso
0
4
Server 1 connesso

Sto uscendo di matto… =( =( =( =( =( =( =( =( =( =(

cavoli mi sa che la ho un ethernet a casa... se solo avessi tempo mannaggia!

Forse ci sono, FORSE!!!

#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:

4
0
Server 2 connesso

Risposta sulla TCP:

Scrivo sull'2

Scherzavo… =( =( =( =( UFFA!!!

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

Sulla TCP ho:

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… =( =( =(

lacia perdere quetsa idea di avere due EthernetServer, crea solo casino.

Il problema potrebbe esseer che nonostante l'ethernet shield possa avere più client, la libreria non sia stat sviluppata di conseguenza...

E' quello che avevo pensato anche io, ma così facendo è un bel casino... =( =( =( =( =( =(

Ma cosa si intende per socket? Cos'è? Se socket = porta sono fregato...

no, leggiti qualcosa sui socket su wikipedia, una porta può evere più socket, in pratica è il gestore di flusso tra due host

Janos io non ti capisco... sono 2 settimane che ti disperi su questo forum. Apri 2 treadh al giorno quasi e +/- chiedi le stesse cose... fanne uno e continua quello. :astonished:

Ora se tu dicessi vorrei fare questo quello e quell'altro con parole tue, sarebbe più facile. Ho una pagina web vorrei che quando si collega uno blabla, quando si collega un altro bla bla.... Con richieste scritte così non finirai mai il tuo progetto te lo garantisco, fai degli esempi.