[solved] Webserver will die IP-Adresse seines Clienten (enc28j60, UIPEthernet)

Hallo,

einen Webserver konnte ich ganz einfach erstellen. Doch jetzt möchte ich dem Clienten seine IP-Adresse anzeigen. Dazu muss ich die erstmal kennen.

[Update] Übrigens benutze ich UIPEthernet für den enc28j60; für das Shield habe ich gefunden, dass es mit "W5100.readSnDIPR(_sock, remoteIP);" geht. Doch wie geht das für den enc28j60?
[Update2] GELÖST (siehe next post). Ehemalige Überschrift "Webserver: Der Client soll seine IP-Adresse angezeigt bekommen: UDP.remoteIP() ?"

Ich habe das hier gefunden:
Arduino - EthernetUDPRemoteIP - "UDP.remoteIP()"

Doch leider sagt mir UDP nicht so viel, außer dass es ein Protokoll ist, mit dem Daten im Internet übetragen werden können.

Als Webserver habe ich erstmal den Beispielscode von 'Examples' -> 'Ethernet' -> 'WebServer' genommen, damit dort sich keine Fehler einschleichen. Und das funktioniert auch prima.

Doch wenn ich einfach den Code mit

int packetSize = Udp.parsePacket();

und so weiter in den Loop einfüge, hat die Abfrage "if(packetSize)..." nie true ausgeben (also das was danach kommt wurde nie ausgeführt), obwohl der Webserver funktioniert?!

Leider gibt "UDP.begin()" ja kein Ergebnis (´laut der Dokumentation: Arduino - EthernetUDPBegin) , daher weiß ich gar nicht wo der Fehler liegt...

Kann mir jemand helfen, die IP-Adresse des Clients herauszufinden, wenn er auf den Webserver zugreift (also wenn bei "server.available()" was herauskommt)?

~ Grüße

Problem gelöst! (Das nächste hat nicht lange auf sich warten lassen...)

Eine "experimental" revision hat das neue Feature:
ntruchsess/arduino_uip at UIPEthernet_Exp1.03 · GitHub (cpp, header)

Da in der cpp in Zeile 149 wird die Funktion folgendermaßen definiert:

IPAddress
UIPClient::remoteIP() {
  if (!_uip_conn) return IPAddress();
  return ip_addr_uip(_uip_conn->ripaddr);
}

Dabei ist die "_uip_conn" ein privates 'struct', das offensichtlich die IP-Adresse gespeichert hält (scheint in der uip-Datei im utility-Ordner beschrieben zu werden...).

Auf jeden Fall klappt es :wink:

Code:

// Webserver: Der Client soll seine IP-Adresse angezeigt bekommen - Arduino Forum
// http://forum.arduino.cc/index.php?topic=251783.0
// 27.6.2014

#define UIPETHERNET_DEBUG    1 // doesnt show up any debug

#include <SPI.h>
#include <UIPEthernet.h>

// Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 2, 177);

// Server
EthernetServer server(1000); //port: 1000


void setup()
{
  Serial.begin(9600);
  Serial.println("Go");
  // start the Ethernet and Server:
  Ethernet.begin(mac, ip);
  Serial.println("init ok");
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
  Serial.println();
  server.begin();
  Serial.println("Server ready\n\n");
}


void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("> Connection from: ");
    Serial.print(client.remoteIP());
    Serial.print(":");
    Serial.println(client.remotePort());

    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();

        // Serial.print(">> ");
        Serial.write(c);
      }
    }
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("\n> Disonnected.\n");
  }
}

Serial-Monitor-Ausgabe:

Go
init ok
My IP address: 192.168.2.177

Server ready


> Connection from: 
192.168.2.123:53225
123456789abcdef000xyzÿ
> Disonnected.

Windows-Befehl:

cmd /C telnet 192.168.2.177 1000

(mit STRG und Plus-Zeichen kommt man wieder ins telnet-menü (interactive mode), dann dort 'close' oder sogar 'quit' eingeben)

~Grüße.