libshout - connection failed



  • Hi!
    Ich weiss nicht, ob das hier das richtige Forum hierfür ist. Wenn nicht, dann
    bitte verschieben.

    Ich möchte einen Source-Client mit libshout in C++ unter Debian programmieren.
    Jedoch schlägt der Login fehl. Auf der selben Maschine mit ices funktioniert es.
    Die Zugangsdaten habe ich mehrfach überprüft. Auch im Log von icecast steht,
    dass name und PW fehlen oder ungültig sind.
    Hier der Code meiner Testklasse:

    #include "stream.h"
    
    cStream::cStream()
    {
        shout_init();
    }
    
    cStream::~cStream()
    {
        shout_close(mStream);
        shout_free(mStream);
        shout_shutdown();
    }
    
    int cStream::OpenFile()
    {
        mStreamfile = fopen ("/home/mase/kickback - les 150 passions meurtrieres/05 - kickback - on the prowl.mp3", "rb");
        return 0;
    }
    
    int cStream::CloseFile()
    {
        fclose(mStreamfile);
        return 0;
    }
    
    int cStream::InitStream()
    {
    
        if (!(mStream = shout_new()))
        {
            printf("Could not allocate shout_t\n");
            return 1;
        }
    
        if (shout_set_host(mStream, "SERVERHOSTNAME") != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting hostname: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_port(mStream, 8000) != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting port: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_user(mStream, "mase") != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting user: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_password(mStream, "GEHEIM") != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting password: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_mount(mStream, "/mase.mp3") != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting mount: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_protocol(mStream, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting protocol: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        if (shout_set_format(mStream, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS)
        {
            std::cout << "Error setting user: " << shout_get_error(mStream) << "\n";
            return 1;
        }
    
        std::cout << shout_get_host(mStream) << "\n";
        std::cout << shout_get_port(mStream) << "\n";
        std::cout << shout_get_user(mStream) << "\n";
        std::cout << shout_get_password(mStream) << "\n";
        std::cout << shout_get_protocol(mStream) << "\n";
        std::cout << shout_get_format(mStream) << "\n";
        std::cout << shout_get_mount(mStream) << "\n";
    
        if (shout_open(mStream) == SHOUTERR_SUCCESS)
        {
            std::cout << "Connected to server...\n";
            mTotal = 0;
        }
        else
        {
            std::cout << "Error connecting: " << shout_get_error(mStream) << "\n";
        }
    
    }
    
    int cStream::Send()
    {
        while (true)
        {
            mRead = fread(mStreambuffer, 1, sizeof(mStreambuffer), mStreamfile);
            mTotal += mRead;
    
            if (mRead > 0)
            {
                mRet = shout_send(mStream, mStreambuffer, mRead);
                if (mRet != SHOUTERR_SUCCESS)
                {
                    std::cout << "DEBUG: Send error: " << shout_get_error(mStream) << "\n";
                    break;
                }
            }
            else
            {
                break;
            }
    
            shout_sync(mStream);
        }
    
        return 0;
    }
    

    Die ganzen couts sind zum Debuggen da. Die Ausgaben enthalten die korrekten Werte.
    Hier noch die main-Funktion:

    #include "stream.h"
    
    int main()
    {
        cStream *Stream = new cStream;
    
        Stream->OpenFile();
        Stream->InitStream();
        Stream->Send();
        Stream->CloseFile();
    
        delete Stream;
    }
    

    Was mach ich nur falsch?



  • Er verbindet jetzt!
    Aber nur, wenn der Benutzername auf "source" gesetzt ist.
    Warum nimmt er "mase" nicht an. ices ist auch auf "mase" eingestellt?
    Und da geht's ja auch.



  • mase schrieb:

    Er verbindet jetzt!
    Aber nur, wenn der Benutzername auf "source" gesetzt ist.
    Warum nimmt er "mase" nicht an. ices ist auch auf "mase" eingestellt?
    Und da geht's ja auch.

    viellecht, wegen fehlernder Leseberechtigung ins /home/mase?



  • mase schrieb:

    Er verbindet jetzt!
    Aber nur, wenn der Benutzername auf "source" gesetzt ist.
    Warum nimmt er "mase" nicht an. ices ist auch auf "mase" eingestellt?
    Und da geht's ja auch.

    Der Benutzername muss source sein. Das lässt sich nicht umstellen bzw. es funktioniert nur mit diesem - im Prinzip ist die Benutzername-Funktion bei IceCast nutzlos 🙂

    blan



  • Vielen Dank!
    Dann lassen wir es bei source.


Anmelden zum Antworten