Woher weiß UDP Server die Client-IP?



  • Hi,

    UDP ist verbindungslos, d.h. es gibt kein Verbinden, nur Senden und Empfangen. Nun habe ich einen ganz einfachen UDP Server. Ich verwende sendmsg() und recvmsg(). Der Client sendet zuallererst; der Server soll dem Client antworten.

    Meine Frage: Woher weiß der UDP Server die IP des Clients?
    -> ich könnte es in die Message schreiben, aber ich kann den Code des Clients nicht ändern.
    -> eigentlich hat recvmsg() eine msghdr struct, die eine sockaddr struct enthält. Die ist aber leider NULL bei mir - darüber erfahre ich also nix. 😞

    Vielen Dank für Antworten im Voraus!

    Gruß,
    voidpointer



  • Versuche mal das sockaddr struct zu deklarieren und eine Referenz darauf bei recvmsg() mitzugeben. Dann sollte recvmsg() das struct füllen und du kriegst dir Adresse.



  • voidpointer schrieb:

    Meine Frage: Woher weiß der UDP Server die IP des Clients?

    sobald ein ip-paket eintrudelt (egal ob udp, tcp, sonstwas), weiss der empfänger, von wem es ist (absenderadresse steckt im ip-header), das hat mit verbindungslos bzw. verbindungsorientiert nichts zu tun.
    🙂



  • Du nimmst der Taube das Blatt von Fuß, da sind Zeichen drauf. Die ersten 24 kannst du ignorieren. Die nächsten 8 sind deine Adresse als big-endian-Zahl. Das ist wichtig, weil noch niemand im Feldversuch geprüft hat, ob Viecher auch ankommen, wenn man da eine little-endian-Zahl hinschreibt.
    🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • voidpointer schrieb:

    Hi,

    UDP ist verbindungslos, d.h. es gibt kein Verbinden, nur Senden und Empfangen. Nun habe ich einen ganz einfachen UDP Server. Ich verwende sendmsg() und recvmsg(). Der Client sendet zuallererst; der Server soll dem Client antworten.

    Meine Frage: Woher weiß der UDP Server die IP des Clients?
    -> ich könnte es in die Message schreiben, aber ich kann den Code des Clients nicht ändern.
    -> eigentlich hat recvmsg() eine msghdr struct, die eine sockaddr struct enthält. Die ist aber leider NULL bei mir - darüber erfahre ich also nix. 😞

    Vielen Dank für Antworten im Voraus!

    Gruß,
    voidpointer

    Ich glaube du hat nicht ganz verstanden, was Verbindungsorientiert und Verbindungslos bedeutet.

    Lies das Buch von Tanenbaum "Computernetzwerke", da steht es schon im ersten Kapitel drin.



  • Der Titel wurde zu Unrecht verschoben - ich suche nach einer Möglichkeit in ausschließlich C/C++.

    nwp2 schrieb:

    Versuche mal das sockaddr struct zu deklarieren und eine Referenz darauf bei recvmsg() mitzugeben. Dann sollte recvmsg() das struct füllen und du kriegst dir Adresse.

    Danke, das hatte ich auch probiert: Ich deklariere eine struct msghdr und gebe sie als buffer an recvmsg(). Die wird dann auch mit Daten gefüllt, aber das socket (msg_name) wird immer als NULL-Pointer übergeben. Was nun?

    ;fricky schrieb:

    sobald ein ip-paket eintrudelt (egal ob udp, tcp, sonstwas), weiss der empfänger, von wem es ist (absenderadresse steckt im ip-header)

    @;fricky, µngbd : Danke, ich sehe es auch gerade in Wireshark. Aber wie komme ich da nach meinem recvmsg() call ran?



  • voidpointer schrieb:

    Danke, das hatte ich auch probiert: Ich deklariere eine struct msghdr und gebe sie als buffer an recvmsg(). Die wird dann auch mit Daten gefüllt, aber das socket (msg_name) wird immer als NULL-Pointer übergeben. Was nun?

    Code zeiegn



  • voidpointer schrieb:

    Aber wie komme ich da nach meinem recvmsg() call ran?

    recvmsg() kenn ich nicht, aber versuch doch mal 'recvfrom()', der kannste einen pointer auf eine 'struct sockaddr' übergeben, die dann mit infos über das empfangene paket gefüllt wird.
    🙂



  • Oh oh sry, hab in den Buffer geschaut, BEVOR ich recvmsg() darauf losgelassen habe 😕 Problem gelöst 😉


Anmelden zum Antworten