Kann es daher kommen das ich den Ethernetserver 2 mal starte?
Ja, Du deklarierst zweimal die Variable mit dem Namen client, und zwar mit unterschiedlichem Gültigkeitsbereich: Einmal in der Funktion "loop" und einmal in der Funktion "printMyFile".
Mache Dir klar, was das bedeutet:
EthernetClient client = server.available();
Das sind eigentlich zwei Programmzeilen zusammengefasst, und zwar eine Variablendeklaration:
EthernetClient client; // Deklarieren den Namen "client" vom Typ "EthernetClient" (was ein Objekttyp aus einer Library ist).
und einer Zuweisung:
client = server.available();
wobei "server" ebenfalls ein Objekt aus einer Library ist (Typ EthernetServer), das ganz oben in Deinem Programmcode deklariert ist.
Am besten machst Du Dir mal Gedanken über den GÜLTIGKEITSBEREICH von deklarierten Namen:
- Deklaration innerhalb einer Funktion ==> Gültig nur innerhalb der Funktion ("lokale Variable")
- Deklaration außerhalb einer Funktion ==> Gültig im ganzen Programm ("globale Variable")
Du hast nun zwei Möglichkeiten, den Client in der Funktion verfügbar zu machen: Entweder erweiterst Du die Parameterliste der selbstgeschriebenen Funktion (in der bisher nur der String als Dateiname übergeben wird) um einen weiteren Paramter passenden Typs, um den "client" ebenfalls als Parameter zu übergeben.
Oder Du machst mit "client" das, was auch mit "server" der Fall ist: Eine "globale Variable" deklarieren statt einer lokalen Variablen, die nur in "loop" gültig ist.
Also deklarierst Du oben im Code (außerhalb von Funktionen!) sowohl "server" als auch "client" als globale Variablen:
(Oberhalb/außerhalb der loop und anderen Funktionen, globale Variablen):
EthernetServer server(80); //server port
EthernetClient client;
Und dann stehen sowohl die Variablen "client" als auch "server" im ganzen Programm zur Verfügung, einschließlich Deinen selbstgeschriebenen Funktionen, ohne dass eine Übergabe als Parameter notwendig ist.
Die bisherige Deklaration an der Stelle in der loop muss dann dort natürlich verschwinden (sonst hättest Du wieder eine doppelte Deklaration), aus der bisherigen "Deklaration mit Zuweisung" in der Loop wird einfach nur eine Zuweisung:
(In der loop) aus:
EthernetClient client = server.available(); // Deklaration und Zuweisung
wird:
client = server.available(); // Zuweisung
Und in Deiner selbstgeschriebenen Funktionen natürlich genau dasselbe.
So ungefähr. Dann hast Du am jeweils eine "globale" Deklaration für "server" und für "client" (Deklaration "oben" im Programm und außerhalb von allen Funktionen) und kannst diese in jeder Funktion Deines Programms verwenden, ohne sie per Funktionsparameter übergeben zu müssen.