C++ Shoutcaststream speichern



  • Ich versuche einen Shoutcaststream mit Winsock zu speichern (und später direkt abzuspielen).
    Es funktioniert auch soweit einigermaßen, denn die Datei lässt sich mit WMP öffnen. Jedoch hängt die Wiedergabe sehr.
    Das speichern mit Firefox macht keine Probleme 😕 .

    #include <windows.h>
    #include <winsock2.h>
    #include <process.h>
    #include <stdio.h>
    
    int startWinsock(void);
    SOCKET s;
    void recvthread(void *);
    
    int main(){
        long rc;
    
        rc = startWinsock();
    
        if(rc!=0){ //Errorcheck
            printf ("Error at starting winsock: %d\n", rc);
            return 1;
        }
    
        s = socket(AF_INET, SOCK_STREAM, 0);
    
        if(s == INVALID_SOCKET){ //Errorcheck
            printf ("Error at creating socket: %d\n", WSAGetLastError());
            return 1;
        }
    
        SOCKADDR_IN addr;
    
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(80);
        addr.sin_addr.s_addr=inet_addr("217.198.143.187");
        rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR)); //connect to Shoutcast
    
        if(rc == SOCKET_ERROR){ //Errorcheck
            printf ("Error at connect: %d\n", WSAGetLastError());
            return 1;
        }
    
        _beginthread(recvthread, 0, (void*)12);
    
        char buf[9999];
    
        strcpy(buf, "GET /stream/1/ HTTP/1.1\r\nUser-Agent: TL-Player\r\n\r\n");
    
        rc = send(s, buf, strlen(buf), 0);
    
        while(true){}
    
        return 0;
    }
    
    int startWinsock(){
        WSADATA wsa;
        return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    void recvthread(void *arg){
        FILE * out = fopen("file.mp3", "wb");
        long rc;
        int step = 0;
    
        while(true){
            char buf[9999];
            rc = recv(s, buf, 9999, 0); //fill buffer buf
    
            if(rc != SOCKET_ERROR){
                if(step != 0) //strip shoutcast header at first recv()
                    fwrite (buf, 1, sizeof(buf), out); //write received data to file.mp3
                if(step > 10){   //stop after 11 recv()'s,
                    fclose(out); //close file.mp3
                    exit(0);     //and exit
                }
                step += 1;
            }
            else //Errorcheck
                printf ("Error at recv(): %d\n", WSAGetLastError());
    
            if(rc == 0){
                printf ("Connection closed!\n");
            }
        }
    }
    


  • Du willst nicht sizeof(buf), sondern rc byte schreiben. Zum Rest sag ich mal nichts. 😉



  • Danke!!! Der Lagg is weg 😃 😃 😃


Anmelden zum Antworten