UDP SOCKADDR_IN Problem/ Frage



  • theta schrieb:

    Ein bisschen wenig Kontext, aber es sieht so aus, als würdest Du SOCKADDR_IN Pointer in clients speichern. Vermutlich ist das Objekt danach aber nicht mehr gültig (z.B. weil Du recvfrom(..) und sendto(..) in verschiedenen Scopes hast).
    Simon

    scopes? wie kann ich denn das problem umgehen das es dennoch gueltig ist?



  • Entweder:
    Speichere die SOCKADDR_IN Objekte in der Liste als Wert, nicht als Pointer.
    Beim Zugriff holst Du dir dann (via Referenz) den Pointer.
    Dazu ist aber eine std::list nötig (std::vector geht nicht, da allenfalls umkopiert wird).

    Oder:
    Du erzeugst deine SOCKADDR_IN Objekte auf dem Heap. (Löschen nicht vergessen...).

    Simon

    Edit: Ich sehe gerade, dass kopieren des Vectors und deren Elemente kein Problem darstellt. ➡ std::vector geht auch.



  • theta schrieb:

    Entweder:
    Speichere die SOCKADDR_IN Objekte in der Liste als Wert, nicht als Pointer.
    Beim Zugriff holst Du dir dann (via Referenz) den Pointer.
    Dazu ist aber eine std::list nötig (std::vector geht nicht, da allenfalls umkopiert wird).

    Oder:
    Du erzeugst deine SOCKADDR_IN Objekte auf dem Heap. (Löschen nicht vergessen...).

    Simon

    Edit: Ich sehe gerade, dass kopieren des Vectors und deren Elemente kein Problem darstellt. ➡ std::vector geht auch.

    Mhh okay, war folgendes gemeint?

    SOCKADDR_IN remoteAddr;
    vector<SOCKADDR_IN*> clients;
    bytes=recvfrom(s,buf,BUF_SIZE,0,(SOCKADDR*)&remoteAddr,&addrlen);
    clients.push_back(remoteAddr); 
    .....
    bytes=sendto (s,buf,strlen(buf),0,(SOCKADDR*)&clients[0],sizeof(SOCKADDR_IN));
    

    das funktioniert bei mir nämlich nicht. Habe ich einen Denkfehler?



  • Ich meinte nicht so. Du speicherst immer noch Pointer.

    Zeigmal ein wenig mehr Code.

    Ist das Teil einer Klasse? Was sind Member (der clients vector?)?

    Simon



  • theta schrieb:

    Ich meinte nicht so. Du speicherst immer noch Pointer.

    Zeigmal ein wenig mehr Code.

    Ist das Teil einer Klasse? Was sind Member (der clients vector?)?

    Simon

    Nein ich speicher jetzt nicht mehr als pointer, wie dem "&" zu entnehmen ist. Ich habe nur das * vergessen zu löschen: vector<SOCKADDR_IN*> clients; was ich selbstverständlich im code getan habe.

    Ich bin dankbar fuer weitere Vorschläge 🙂 Ich wüsste jetzt nicht genau was dir noch an code weiter helfen wuerde?!



  • nabend 🙂 ich bin immer noch dankbar fuer ideen, warum die addresse, nicht mehr nutzbar ist. oder fuer den hinweis, dass ich auch bei udp den socket mitspeichern muss. danke 🙂



  • mmarcel1 schrieb:

    theta schrieb:

    Ich meinte nicht so. Du speicherst immer noch Pointer.

    Zeigmal ein wenig mehr Code.

    Ist das Teil einer Klasse? Was sind Member (der clients vector?)?

    Simon

    Nein ich speicher jetzt nicht mehr als pointer, wie dem "&" zu entnehmen ist. Ich habe nur das * vergessen zu löschen: vector<SOCKADDR_IN*> clients; was ich selbstverständlich im code getan habe.

    Ich bin dankbar fuer weitere Vorschläge 🙂 Ich wüsste jetzt nicht genau was dir noch an code weiter helfen wuerde?!

    *g* ja, habe nur bis vector<..> gelesen.. 🙂

    Zeig doch mehr code, da kann Dir besser geholfen werden.
    Simon



  • Es geht sich hierbei um eine dll.

    // Erster aufruf + Callback
    void DLL_EXPORT ext_refresh() {
            bytes=recvfrom(s,buf,BUF_SIZE,0,(SOCKADDR*)&remoteAddr,&addrlen);
            buf[bytes]='\0';
            clients.push_back(&remoteAddr);
            (*sp_on)(buf);
    }
    // Funktionsaufruf, um auf "clients" zuzugreifen
    char DLL_EXPORT *ext_getpath(int client) {
        string strcheck;
        char *get1 = "Hallo12";
    
        sprintf(buf,"give");
        sendto (s,buf,strlen(buf),0,(SOCKADDR*)clients[0],addrlen);
        Sleep(10);
        bytes=recvfrom(s,buf,BUF_SIZE,0,(SOCKADDR*)&remoteAddr, &addrlen);
        buf[bytes] = '\0';
        strcpy(get1, buf);
    
        return get1;
    }
    
    vector<SOCKADDR_IN*> clients; // ist in der dll global deklariert.
    

    rufe ich clients[0] direkt nach dem anlegen mit sendto auf, funktioniert es einwandfrei, nur nach dem callbkac und dem aufruf der zweiten funktion nicht mehr. Danke fuer eure Hilfe 🙂



  • Sorry, ich habe keine Nerven mehr.
    Da ist sovieles Durcheinander....
    Simon

    Edit:
    Das löscht ja Volkard wahrscheinlich wieder, aber zu meiner Verteidigung, es ist nicht böse gemeint.



  • theta schrieb:

    Sorry, ich habe keine Nerven mehr.
    Da ist sovieles Durcheinander....
    Simon

    Edit:
    Das löscht ja Volkard wahrscheinlich wieder, aber zu meiner Verteidigung, es ist nicht böse gemeint.

    genau das gleiche hatte ich mir auch gedacht xD
    aber dann mal doch wenigsten noch das, was mir als allererstes aufgefallen ist:

    char* x = "asd";
    x[1] = 'S';
    

    das hier ist verboten - damit ist insbesondere auch dein strcpy verkehrt.
    (literale dürfen in einem speicher mit nur lese-rechten gespeichert werden -> schreiboperationen auf adressen in diesem bereich führen zu undefiniertem verhalten.)

    die zeile char* x = "asd"; gibt imho schon eine warning, wegen des vergessenen cv-qualifiers... (google mal nach const correctness)

    du brauchst also die länge...
    bzw. eine feste länge für einen puffer und verwendest dann std::string bzw std::vector<char> - je nach dem, was logischer erscheint...

    Sleep(10);
    wieso tust du das?
    was ist, wenn eine übermittlung mal länger als 10ms dauert? (was ja gar nicht mal so unrealistisch ist...)

    etc...

    bb


Anmelden zum Antworten