Go Down

Topic: Arduino Server (Read 293 times) previous topic - next topic

janvonnebenan

Hallo Forum,

ich habe ein Problem mit der Programmierung eines Servers. Ich möchte gerne, dass der Server den Client begrüßt, wenn dieser eine Verbindung aufgebaut hat. Allerdings gibt server.available() nur einen Wert zurück, wenn der Client dem Server etwas (CR+LF reicht aus) geschickt hat.

Hier mal mein Programm:

Code: [Select]

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 17 };
#define PORT 12345

EthernetServer server = EthernetServer(PORT);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  delay(500);
}

void loop()
{
EthernetClient client = server.available();
  if (client) {
  client.println("Herzlich willkommen auf diesem Server!");
  client.flush();
            while (client.connected()) {
    if (client.available()) {
        char c;
int charsWaiting, charsReceived = 0;
char textBuff[80];
 
  charsWaiting = client.available();
  do {
    c = client.read();
    if ((c != '\n') && (c != '\r')){
    textBuff[charsReceived++] = c;
    }
  }
  while(--charsWaiting > 0);

textBuff[charsReceived] = '\0';
client.print("Du sagtest: ");
  client.println(textBuff);
  textBuff[0] = '\0';
    charsReceived = 0;
}
          }
    delay(1);
    client.stop();
  }
}


Getestet habe ich mit Telnet:

macbook-pro:~ user$ telnet 192.168.178.17 12345
Trying 192.168.178.17...
Connected to 192.168.178.17.
Escape character is '^]'.

Herzlich willkommen auf diesem Server!
Test
Du sagtest: Test
^]
telnet> quit
Connection closed.
macbook-pro:~ user$

Nach dem "Escape character is '^]'." habe ich Return gedrückt und dann kam die Begrüßung. Über einen Denkanstoß würde ich mich sehr freuen. Aber bis jetzt sieht es so aus, als ob die Arduino-Ethernet-Library das nicht kann bzw. wenn man einen Webserver programmiert ist das auch kein Problem, weil dann der Browser den Server gleich dichtschwallert, was er alles kann und wer er ist.

Grüße
Jan

mkl0815

Genau so ist es, die Ethernet-Lib "kann" das nicht. Schau mal hier:
http://arduino.cc/forum/index.php/topic,137031.msg1029945.html
Für genau das Problem hab ich mir mal die Zeit für eine Analyse genommen. Eine mögliche Anpassung der Ethernet-Lib gibt es in dem Thread auch, damit das was Du machen willst auch geht. Aber Achtung, die Änderung ist nicht offiziell und kann ggf. ungewollte Nebenwirkungen haben.
Mario.

janvonnebenan

Danke Mario!

Ich habe das "if (client.available())" aus "EthernetServer::available()" in der Library auskommentiert. Du hast natürlich vollkommen recht, wer weiß, was jetzt noch alles kaputt gegangen ist. Aber mal ehrlich. So macht es mehr Sinn. Ich glaube, die haben das nur nicht gemerkt, weil viele Clients Daten senden. ;)

Vielen Dank für die Hilfe (Mich hat das zwei Tage gekostet)
Jan

Go Up