Ethernet Libary, Unterschied zwischen if(client) und if(server.available)

Hallo,

Ich bin gerade dabei die Ethernet Libary auszuprobieren und verwende dazu folgenden Code:

//Erstellt einen Webserver mit IP Adresse 192.168.130.12

// Arduino-Webserver
#include <SPI.h>
#include <Ethernet.h>

// Ethernet-Konfiguration
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xF5, 0xED };                  //mac-Adresse
byte ip[] = {192,168,130,12};                                         //IP-Adresse

EthernetServer server(80);                                            // Serverobjekt mit Standardport 80
EthernetClient client;

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac,ip);                                              // Ethernet-Initialisierung

  delay(1000);
 
  server.begin();                                                      // Server bereit, wartet auf Anfragen
}

void loop()
{
  client = server.available();

  if (client)
  {
    Serial.print("Anfrage erhalten");
    
    server.println("HTTP/1.1 200 OK");
    server.println("Content-Type: text/html");
    server.println();
    server.print("<HTML>");

    server.println("Diese Seite verwendet einen Arduino als Webserver.");

    server.print("</HTML>");
    delay(10);
    client.stop();
  }
}

Worüber ich mich wundere sind die ersten Zeilen des loop Teils.
Wenn client gleich server.available(); ist und die if Bedingung dann wahr ist wenn client wahr zurückgibt, dann müsste es doch eigendlich ausreichen

 if (server.available())

zu schreiben und das  client = server.available(); davor einfach weg zu lassen.
Funktionieren tut das bei mir aber nicht.

Weis jemand warum???

Im Voraus schonmal danke für eure Antworten…

Hier werden zwei Dinge gemacht.

Wenn ein Client für den Server verfügbar ist, dann liefert die Methode "server.available()" ein Objekt vom Typ "EthernetClient" zurück. Wenn kein Client verfügbar ist, dann wird "NULL" zurückgeliefert.

Du könntest zwar "if (server.available())" verwenden, das wäre theoretisch nicht falsch, hat aber einen großen Nachteil. Du weißt zwar, das es einen Client (sprich eine Netzwerkanfrage) an Deinen Arduino gibt, kannst darauf aber nicht reagieren.

Deshalb macht man zuerst

client = server.available();

Damit hat "client" entweder ein EthernetClient Objekt als "Inhalt" oder es ist "NULL".
Nun kann man einfach mit

if (client)

prüfen, ob ein Client verfügbar ist UND man kann das Objekt gleich verwenden, um einen Antwort zu senden.
Mario.

Heist das, dass man mit client.Print an einen Bestimmten Client eine Antwort schickt und mit server.print an alle möglichen Clients, die gerade verfügbar sind?

So ist es.

Okay, danke, jetzt gibt es für mich einen Sinn.