002
01.04.2004, 15:18 Uhr
Holger1976
|
Hm danke, aber das Problem bleibt bestehen. Das Programm lädt von einer z.b. 650 kb grossen Daten nur 132,8 runter. Von einer 6,5 MB grossen Datei komischerweisse 1,3 MB. Hier mal das ganze Programm/Klasse:
C++: |
class Socket { public:
int Sock; char Buffer[8192]; int Count; char Url[100]; char *Host; char *Path; unsigned long Addr; signed int Bytes_Sent;
Socket(void) //Konstruktor { Sock = 0; Count = 0; Addr = 0; Bytes_Sent = 0; memset(Buffer, 0, sizeof (Buffer)); memset(Url, 0, sizeof (Url));
} ~Socket(void) //Destruktor { Sock = 0; Count = 0; Addr = 0; Bytes_Sent = 0; memset(Buffer, 0, sizeof (Buffer)); memset(Url, 0, sizeof (Url)); }
float Socket_Creation() { struct sockaddr_in server; struct hostent* Host_Info = NULL;
//Url eingeben die man aufrufen will cout << "Bitte die Url eingeben: (z.b.www.yahoo.de): " ; cin >> Url;
//Eingebene Url in Host und Pfad splitten Host = strtok(Url,"/"); Path = strtok(0," "); cout << Host; cout << Path; // Erzeuge das Socket Sock = socket( PF_INET, SOCK_STREAM, 0); if (Sock < 0) { cerr << "Kann Socket nicht erstellen"; exit(1); }
// Erzeuge die Socketadresse des Servers. Sie besteht aus Typ, // IP-Adresse und Portnummer // Url ist eine numerische IP-Adresse memset(&server, 0, sizeof (server)); if ((Addr = inet_addr(Url)) != INADDR_NONE) memcpy(&server.sin_addr, Host_Info->h_addr, Host_Info->h_length); // Wandle den Servernamen in eine IP-Adresse um else { Host_Info = gethostbyname(Url); cout << (int)Host_Info; if (NULL == Host_Info) { cout << "Unbekannter Server: "<< Url; exit(1); } else memcpy( (char *)&server.sin_addr, Host_Info->h_addr, Host_Info->h_length); }
//Portnummer des Dienstes ermitteln //Nornmalerweise 80, aber sicher ist sicher :-) servent* serviceinfo = getservbyname ("http", "tcp"); server.sin_port = serviceinfo->s_port; server.sin_family = AF_INET;
// Baue die Verbindung zum Server auf if (connect( Sock, (struct sockaddr*)&server, sizeof( server)) < 0) { cerr << "Kann Verbindung zum Server nicht aufbauen"; exit(1); }
// Erzeuge und sende den http GET request //cout << "Bitte die Seite eingeben die du aufrufen willst: " ;cin >> Path; sprintf( Buffer, "GET /%s HTTP/1.0\nHost: %s\n\n",Path, Host); Bytes_Sent = send (Sock, Buffer, strlen (Buffer), 0);
//Überprüfen ob send Anfrage //angekommen ist if (Bytes_Sent == -1) { cerr << "Fehler bei Sendeanfrage"; exit (1); }
// Hole die Serverantwort und gib sie auf Datei aus ofstream AusgabeDatei(Url); int ControlCounter = 0;
do { Count = recv( Sock, Buffer, 8192, 0); Buffer[Count] = '\0'; if (Count > 0) { AusgabeDatei << Buffer; memset(Buffer, 0, sizeof(Buffer)); } } while (Count > 0);
// Schließe Verbindung und Socket cout << "Download abgeschlossen :o)"; closesocket(Sock); return Count; } };
|
Bearbeitung von typecast: |
cpp-Tags gesetzt
|
Dieser Post wurde am 01.04.2004 um 15:27 Uhr von typecast editiert. |