Ethernet - server.accept()

Leírás

A hagyományos server.available() függvény csak az adatok elküldése után közöl egy új klienst, ami lehetetlenné teszi bizonyos protokollok, például az FTP megfelelő megvalósítását.

A szándék az, hogy a programok vagy az avaliable() vagy az accept() függvényt használják, de mindkettőt nem. Az available() segítségével az ügyfélkapcsolatot továbbra is az EthernetServer kezeli. Nem kell megőriznie egy kliens objektumot, mivel az available() meghívásával megkaphatja az ügyfél által küldött adatokat. Egyszerű szerverek nagyon kevés kóddal írhatók az available() használatával.

Az accept() segítségével az EthernetServer csak egyszer adja meg a klienst, függetlenül attól, hogy küldött-e adatokat. Nyomon kell tartania a csatlakoztatott ügyfeleket. Ez több kódot igényel, de nagyobb irányítást kap.

Szintaxis

server.accept()

Paraméterek

Nincs

Visszatérési érték

egy Client objektum. Ha egyetlen ügyfélnek sem áll rendelkezésére olvasható adat, akkor ez az objektum hamisra értékeli az if-utasításban. (EthernetClient).

Példa

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 69, 104);

// A telnet alapértelmezés szerint a 23-as portot használja
EthernetServer server(23);

EthernetClient clients[8];

void setup() {
  Ethernet.begin(mac, ip);

  // Nyissa meg a soros kommunikációt, és várja meg, amíg megnyílik a port:
  Serial.begin(9600);
  while (!Serial) {
    ; // várja meg a soros port csatlakozását. Csak a natív USB-porthoz szükséges
  }

  // elkezd figyelni az ügyfeleket
  server.begin();
}

void loop() {
  // ellenőrizze, hogy nem csatlakozik-e új kliens, és köszönjön (mielőtt bármilyen bejövő adat érkezik)
  EthernetClient newClient = server.accept();
  if (newClient) {
    for (byte i = 0; i < 8; i++) {
      if (!clients[i]) {
        newClient.print("Hello, client number: ");
        newClient.println(i);
        // Miután "elfogadtuk", a klienst többé nem követi az EthernetServer,
        // ezért el kell tárolnunk a klienslistánkban
        clients[i] = newClient;
        break;
      }
    }
  }

  // ellenőrizze az összes ügyféltől beérkező adatokat
  for (byte i = 0; i < 8; i++) {
    while (clients[i] && clients[i].available() > 0) {
      // beolvassa az ügyféltől bejövő adatokat
      Serial.write(clients[i].read());
    }
  }

  // állítsa le azokat az ügyfeleket, amelyek megszakítják a kapcsolatot
  for (byte i = 0; i < 8; i++) {
    if (clients[i] && !clients[i].connected()) {
      clients[i].stop();
    }
  }
}