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