Aktív témák

  • czappa

    aktív tag

    Most van időm c, c++t tanulni. El is kezdtem, az első lépés egy egyszerű kliens-server alkalmazás lenne.
    Miután megvan a socket foglalás és a bind a szerver oldalon, akkor egy végtelen ciklussal az accept-el várnám a klienseket.
    A lényeg, hogy az accept-től visszakapott azonosító egy ún. ClientHandler osztály konstruktorának egyik paramétere. Egy kliensre működik, de nekem majd több klienst kell kezelnem, ezért első lépésben a egy-egy ClientHandler példányt egy set-ben akarok eltárolni.
    Az eltárolás még megy, de...
    Előbb a kód:

    server.cpp:
    //az összehasonlitas a SET miatt kell, de nekem valójában nem kell a sorrend meghatározása ezért ilyen furcsa a Cmp
    class Cmp{
    public:
    bool operator()(const ClientHandler a, const ClientHandler b)
    {
    if (&a == &b) return false;
    else return true;
    }
    };

    ...

    cout << "Bind sikeres" << endl;
    cout << "Foprogram elott" << endl;
    set<ClientHandler, Cmp> clients; //a set


    while(1){
    listen(foglalat, 1);
    meret = sizeof(ugyfel);
    //új kliens
    uj=accept(foglalat, (struct sockaddr *)&ugyfel, (socklen_t*)&meret);
    if (uj<0){
    cout << "Accept sikertelen." << endl;
    }else{
    //az új kliensnek példányosítunk a ClientHandlerből
    ch = new ClientHandler(uj, ugyfel);
    cout << "Uj kapcsolat... " << endl;
    //ezt eltárolom a SET-be
    clients.insert(clients.begin(), *ch);
    //clients.empty() == true ? cout << "true" : cout<< "false"<<endl;
    //ez csak egy példa: törölném a set összes elemét egyesével, de elotte a ClientHandler kiirValamit fv.-ét meghívom
    while( !clients.empty() ) {
    //ez a hibás sor!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    cout << "Torol: " << (*clients.begin()).kiirValamit() << endl;
    clients.erase( clients.begin() );
    }
    //kilepeunk a vegtelen ciklusbol 1 kliens csatlakozasa utan
    break;
    }
    }

    if (close(foglalat) != 0)
    cout << "Close sikertelen." << endl;
    //delete ch;
    return 0;

    ...
    ClientHandler.cpp:

    char* ClientHandler::kiirValamit(){
    //cout << "kiir baromsagot" << endl;
    return "valami";
    }

    A hiba a "cout << "Torol: " << (*clients.begin()).kiirValamit() << endl;" sorral van:
    passing ‘const ClientHandler’ as ‘this’ argument of ‘char* ClientHandler::kiirValamit()’ discards qualifiers

    A hiba üzenet alapján keresgéltem google-n, elvileg az a gond - ha jól értem -, hogy egy const függvényből egy nem const-ot hívok.
    Az igaz, hogy ha "char* ClientHandler::kiirValamit() const{" -ot írok, akkor lefordul, de
    1) Nem látom, hogy én ezt milyen const függvényből hívom
    2) a kiirValamit még lehetne const, de a valódi alkalmazásban nem ezt a próba fv.-t hívnám meg, és a valódi fv.-nek hozzá kell férjen az osztály adattagjaihoz, hogy módosítsa azokat. (erre a "konstans fv." nem képes)

    A válaszokat előre is köszönöm!

Aktív témák