[c/c++] udp Verbindung erkennen wann ende ist

  • Hallo


    Ich will ein kleines Server Client Tool schreiben.


    Der Server soll auf eine Verbindung warten und wenn eine Verbindung da ist einfach alle X ms eine Nachricht per UDP raus schicken.


    Der Client soll sich einfach mit dem Server verbinden und die Nachrichten empfangen.


    Es muss sich um UDP Nachrichten handeln.


    Mein Problem ist nun das der Server nicht mitbekommt wenn der Client sich beendet hat und immer weiter seine Nachrichten per UDP raus schicken.
    Mir ist klar das UDP Sockets Verbindungslos sind aber es muss doch eine Möglich geben zu erkennen ob die Gegenseite geschlossen wurde.
    Alternativ muss der Client mit eine Nachricht signalisieren das er sich beendet. Das kann aber auch nicht das richtige sein.


    Ein sendto liefert nur die Lokalen Fehler zurück. Das kann es also nicht sein. Type ist SOCK_STREAM


    ICMP Destination Unreachable: wie kann ich das erkennen?

  • Hi,


    sorry, aber du schreibst ein bisschen wirr ;) Du redest gleichzeitig von "Verbindung" und UDP. "Verbindung" ist aber TCP...bei UDP wird keine Verbindung aufgebaut, sondern einfach ein Paket von der Source zur Destination geschickt, ohne jegliche Informationen über einen "Verbindungsstatus".


    Vielleicht solltest du mal generell beschreiben, was du eigentlich genau vor hast. Und auch, warum es UDP sein muss...


    Ciao Louis

  • Moin!


    So verstehe ich UDP auch. Das ist quasi "fire & forget". Ob es ankommt oder überhaupt jemand da ist, der etwas annimmt, kann man nicht sicherstellen.


    Lars.

  • ok, UDP und Verbindung in einem Satz ist vielleicht nicht so schlau. :rolleyes:


    So weit ich es nun verstanden habe, bekommt ein UDP Send aber unter umständen auch ein ICMP_DEST_UNREACH zurück. Das verstehe ich aber noch nicht.
    So wie es aus sieht muss ich das dann aber auch mit recvfrom empfangen.

  • Wenn der Client sich beenden will, schick einfach kurz vorher ein Paket mit dem Wort "ENDE" an den Server
    und warte bis der aufhört zu senden (falls der Server auch an diesen Client sendet).

    vdr 1.7.23 suse 12.1 64 Bit 1xTTS2-6400 HD-USB: 24TB
    vdr 1.7.23 suse 11.3 64 Bit 1xTTS2-6400, 1xTTS2-3200 + ci HD:2TB
    vdr 2.2.0 Raspberry pi HD-USB: 2TB (Garten)

  • So weit ich es nun verstanden habe, bekommt ein UDP Send aber unter umständen auch ein ICMP_DEST_UNREACH zurück.


    Wenn dann schickt das der Router, der das Paket verwirft, weil er keine Route zum Zielhost kennt. Dazu muss der Router aber auch entsprechend konfiguriert sein...und da du nichts über die Netzwerktopologie schreibst (Internet, privates Netz, welche Komponenten, welche Hersteller) kannst auch nur du die Fragen beantworten ;)


    Ciao Louis

  • Bei UDP mußt du dich darum selber kümmern, deshalb ist es UDP.
    Nimm TCP bei den heutigen Bandbreiten, kommt es auf die bessere UDP Performance nicht an.
    Und wenn UDP muß, dann muß der Client ein ACK auf jedes Paket schicken, wenn mit ausreichender Toleranz keine ACK mehr kommen,
    gibt es keinen Client mehr.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • ok, also bestätigen alle meine Annahmen/Befürchtungen.


    Kurzes Wort zum Anwendungsfall. Ich will eine RTP Verbindung für einen SIP Server faken. Daher müssen es UDP Packete mit 160bytes und alle 20ms sein.
    Aber ok, wenn der Client die Verbindung starten kann, dann muss er die auch Stoppen.
    Wollte nur verhindern das irgendwann der Server zu zu vielen Clients sendet die es nicht mehr gibt weil die sich nicht graceful abgemeldet haben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!