Forum: Mikrocontroller und Digitale Elektronik lwIP IP Adresse des Senders herausfinden


von Stefan (Gast)


Lesenswert?

Hallo zusammen,

Ich habe eine Frage zum Thema lwIP. Auf einem STM32F4 läuft das Beispiel 
für einen UDP Server von hier: 
http://mikrocontroller.bplaced.net/wordpress/?page_id=1756

Das klappt soweit alles ganz gut. Man muss jedoch dem lwIP eine Host und 
Remote IP nennen. Gibt es eine Möglichkeit beim Empfang eines Paketes 
die IP Addresse vom Sender herauszufinden?
Ansonsten kann man ja nur an die vorher im Source festgelegte IP 
antworten oder?

Vielen Dank schonmal,

Stefan

von Stefan F. (Gast)


Lesenswert?

Jedes UDP Paket enthält die IP-Adresse des Absenders. Die entsprechende 
call-back Funktion bekommt diese IP Adresse als Parameter übergeben:

http://lwip.wikia.com/wiki/Raw/UDP

von Stefan (Gast)


Lesenswert?

Stefan U. schrieb:
> Jedes UDP Paket enthält die IP-Adresse des Absenders.

Japs, und eben diese würde ich gerne auslesen.
Finde aber keine Structure oder ähnliches wo diese eingetragen / 
gespeichert wird.

Und da ich ja beim senden die udp_send Funktion mit der IP Addresse an 
die ich senden will aufrufen muss, bin ich ja derjenige, der die als 
Parameter übergeben muss. Und ich weiss die Adresse ja nicht.

von Stefan F. (Gast)


Lesenswert?

Wenn der Wiki Artikel nicht zu deinem Programm passt, dann zeige mal 
dein Programm.

Hier ist die gesuchte Struktur: 
http://www.nongnu.org/lwip/2_0_0/structudp__pcb.html

Du musst lernen, Suchmaschinen zu benutzen.

von Johannes S. (Gast)


Lesenswert?

in ub_lib\stm32_ub_udp_server.c ist der udp_receive_callback, da werden 
die Senderinfos nicht benutzt.
Du müsstest die UDP_SERVER_t Struktur um remote_addr und remote_port 
erweitern und diese Felder im receive callback füllen.

von Stefan (Gast)


Lesenswert?

Stefan U. schrieb:
> Hier ist die gesuchte Struktur:
> http://www.nongnu.org/lwip/2_0_0/structudp__pcb.html

Ja, darin hätte ich das auch erwartet... Nur leider stehts dort eben 
nicht drin.

Johannes S. schrieb:
> in ub_lib\stm32_ub_udp_server.c ist der udp_receive_callback, da werden
> die Senderinfos nicht benutzt.
> Du müsstest die UDP_SERVER_t Struktur um remote_addr und remote_port
> erweitern und diese Felder im receive callback füllen.

Ja an der Stelle wollte ich die IP auch ergänzen. Mein Problem war eben 
nur, dass ich die in den Strukturen wo ich sie erwartet hatte, nicht 
gefunden habe, bzw nur die die ich beim Server connect definiert hab.

Hab sie aber mitlerweile gefunden bei der Funktion:

void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf 
*p, struct ip_addr *addr, u16_t port)

Es sind die Übergabeparameter "ip_addr *addr, u16_t port".
Das ist IP und Port vom Absender.

Danke für die Antworten

von Johannes S. (Gast)


Lesenswert?

Stefan schrieb:
> bzw nur die die ich beim Server connect definiert hab.

beim UDP gibt es kein echtes Connect, das ist in der Lib nur 
darübergestülpt, deshalb gibt es das da nicht. Das Connect startet nur 
den Server und macht ein bind() an einen local port. Damit ist der 
Connect ok aber du hast eben noch keinen Gegner.

von Patrick (Gast)


Lesenswert?

Hallo an den Threadersteller,
ich habe genau das gleiche Problem und würde gerne das Beispiel so 
umprogrammieren, dass die Host IP nicht im Quelltext vorher angegeben 
werden muss.
Die Funktion, von der du gesprochen hast, habe ich auch gefunden. Sie 
wird bei mir mit der Funktion

udp_recv(upcb_server, udp_receive_callback, NULL);

in "stm32_ub_udp_server.c" aufgerufen bzw. übergeben. Das ist allerdings 
auch die einzige Stelle.
Beim Programmdurchlauf wird sie auch nicht aufgerufen bzw. durchlaufen.

Wie genau hattest du das Problem jetzt gelöst?

Gruß

Patrick

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.