Ich habe gerade ein Programm geschrieben, das eine Webseite herunterlädt. Wenn ich HTTP/1.0 nutze, dann klappt alles, aber nutze ich HTTP/1.1, dannn werden am Ende und Anfang noch einige Dinge mitgesendet, die da nicht hingehören, denke ich. Ich bin übrigens nicht nach Content-Length gegangen, sondern habe gewartet bis der Server trennt(Connection: Close)...
Hier die Ausgabe:
Zitat:
'HTTP/1.1 200 OK
'
'Date: Sat, 08 Nov 2008 18:33:37 GMT
'
'Server: Apache/2.2.3 (Debian) PHP/4.4.4-8+etch6
'
'X-Powered-By: PHP/4.4.4-8+etch6
'
'Set-Cookie: POSTNUKESID=40a9782024010d53f011b6e64fc72f17; expires=Wed, 09 Nov 2033 00:33:37 GMT; path=/cms
'
'Expires: Thu, 19 Nov 1981 08:52:00 GMT
'
'Cache-Control: cache
'
'Pragma: no-cache
'
'Connection: close
'
'Transfer-Encoding: chunked
'
'Content-Type: text/html
'
'
'
'47b2
'
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'
'<html>'
'<head>'
'<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">'
'<title>c++.de :: Irgendwer hat immer eine Antwort</title>'
'<meta name="KEYWORDS" content="C++, Software, C, C#, STL, OOP, OOA, Objektorientierte Programmierung, Softwareentwicklung, Tutorials, Compiler, Bücher, ebooks, IDE, Programmierung, Proggen, c++.de, Decompiler, Visual, MFC, VCL, main, if, while, else, for, Objekt, .NET, net, gtkmm, qt, wxWidgets, GUI, Dialog, Fenster, Anwendung">'
'<meta name="DESCRIPTION" content="Irgendwer hat immer eine Antwort">'
'<meta name="ROBOTS" content="INDEX,FOLLOW">'
'<meta name="resource-type" content="document">'
[usw......]
'pageTracker._trackPageview();'
'</script></body>'
'</html>
'
'0
'
'
'
Warum? Die ' sind nur zum besseren Debugen und im Original nicht vorhanden. Habt ihr das Problem bei http://www.c-plusplus.de auch oder ist mein Programm fehlerhaft? Aber warum geht es dann perfekt(!) mit HTTP/1.0 aber mit HTTP/1.1 nicht?
bin im Kapitel 6.4 und hab da alles fertig !
Aber irgendwie und aus irgendeinem grund funktioniert der code bei mir nicht !
Hab alles genauso, aber trotzdem geht es bis zur prozentanzeige, da steht dann eben 0% und dann kommt "Socket-Fehler #0: D"
hab meinem code mit dem code von hier verglichen, finde aber nix und wenn ich den code, den ich hier downgeloadet hab, ausprobier, dann funktioniert er, bloß mein selbst geschriebener nicht !
Verstehe ich nicht, weiß jemand rat, gibts noch irgendwas zu beachten ??
// wenn während dem Senden ein Fehler auftritt
runtime_error CreateSocketError()
{
ostringstream temp;
int error = WSAGetLastError();
temp << "Socket-Fehler #" << error;
char *msg;
// um restlichen Buffer noch zu senden, falls send eher aufhört zu senden void SendAll(int socket, const char* const buf, const int size)
{
int bytesSent = 0; // Anzahl Bytes, die bereits vom Buffer gesendet wurden do
{
int result = send(socket, buf + bytesSent, size - bytesSent, 0);
if (result < 0)
{
throw CreateSocketError();
}
bytesSent += result;
} while (bytesSent < size);
}
// liest eine Zeile des Socket in Stringstream (HTTP-Protokoll sendet zeilenweise) void GetLine(int socket, stringstream &line)
{
// byteweise von Socket lesen, bis Zeilenumbruch auftritt for (char c; recv(socket, &c, 1, 0) > 0; line << c)
{
if (c == '\n')
{
return;
}
}
throw CreateSocketError(); // wenn recv < 0 || = 0 ist,
}
int main()
{
WSADATA w;
// man will Zugriff auf Winsock-Lib haben if (int result = WSAStartup(MAKEWORD(2,2), &w) != 0)
{
cout << "Winsock 2 konnte nicht gestartet werden! Error: " << result << endl;
return 1;
}
hostent *phe = gethostbyname("www.kernel.org");
if (phe == NULL)
{
cout << "Host konnte nicht aufgeloest werden!\n";
return 1;
}
if (phe->h_addrtype != AF_INET)
{
cout << "ungueltiger Adress-Typ!\n";
return 1;
}
if (phe->h_length != 4)
{
cout << "Ungueltiger IP-Typ!\n";
return 1;
}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == -1)
{
cout << "Socket konnte nicht erstellt werden!\n";
return 1;
}
sockaddr_in service;
service.sin_family = AF_INET; // für IPv4
service.sin_port = htons(80); // Port 80 nutzt HTTP
// Iterator char **p = phe->h_addr_list; // p mit 1. Listenelement initialisieren int result; // Ergebnis von connect do
{
// Liste zu Ende ? if (*p == NULL)
{
cout << "Verbindung fehlgeschlagen!\n";
return 1;
}
service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p);
++p;
result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
// wenn während dem Senden ein Fehler auftritt
runtime_error CreateSocketError()
{
ostringstream temp;
int error = WSAGetLastError();
temp << "Socket-Fehler #" << error;
char *msg;
// um restlichen Buffer noch zu senden, falls send eher aufhört zu senden void SendAll(int socket, const char* const buf, const int size)
{
int bytesSent = 0; // Anzahl Bytes, die bereits vom Buffer gesendet wurden do
{
int result = send(socket, buf + bytesSent, size - bytesSent, 0);
if (result < 0)
{
throw CreateSocketError();
}
bytesSent += result;
} while (bytesSent < size);
}
// liest eine Zeile des Socket in Stringstream (HTTP-Protokoll sendet zeilenweise) void GetLine(int socket, stringstream &line)
{
// byteweise von Socket lesen, bis Zeilenumbruch auftritt for (char c; recv(socket, &c, 1, 0) > 0; line << c)
{
if (c == '\n')
{
return;
}
}
throw CreateSocketError(); // wenn recv < 0 || = 0 ist,
}
int main()
{
WSADATA w;
// man will Zugriff auf Winsock-Lib haben if (int result = WSAStartup(MAKEWORD(2,2), &w) != 0)
{
cout << "Winsock 2 konnte nicht gestartet werden! Error: " << result << endl;
return 1;
}
hostent *phe = gethostbyname("www.kernel.org");
if (phe == NULL)
{
cout << "Host konnte nicht aufgeloest werden!\n";
return 1;
}
if (phe->h_addrtype != AF_INET)
{
cout << "ungueltiger Adress-Typ!\n";
return 1;
}
if (phe->h_length != 4)
{
cout << "Ungueltiger IP-Typ!\n";
return 1;
}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == -1)
{
cout << "Socket konnte nicht erstellt werden!\n";
return 1;
}
sockaddr_in service;
service.sin_family = AF_INET; // für IPv4
service.sin_port = htons(80); // Port 80 nutzt HTTP
// Iterator char **p = phe->h_addr_list; // p mit 1. Listenelement initialisieren int result; // Ergebnis von connect do
{
// Liste zu Ende ? if (*p == NULL)
{
cout << "Verbindung fehlgeschlagen!\n";
return 1;
}
service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p);
++p;
result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
// wenn während dem Senden ein Fehler auftritt
runtime_error CreateSocketError()
{
ostringstream temp;
int error = WSAGetLastError();
temp << "Socket-Fehler #" << error;
char *msg;
// um restlichen Buffer noch zu senden, falls send eher aufhört zu senden void SendAll(int socket, const char* const buf, const int size)
{
int bytesSent = 0; // Anzahl Bytes, die bereits vom Buffer gesendet wurden do
{
int result = send(socket, buf + bytesSent, size - bytesSent, 0);
if (result < 0)
{
throw CreateSocketError();
}
bytesSent += result;
} while (bytesSent < size);
}
// liest eine Zeile des Socket in Stringstream (HTTP-Protokoll sendet zeilenweise) void GetLine(int socket, stringstream &line)
{
// byteweise von Socket lesen, bis Zeilenumbruch auftritt for (char c; recv(socket, &c, 1, 0) > 0; line << c)
{
if (c == '\n')
{
return;
}
}
throw CreateSocketError(); // wenn recv < 0 || = 0 ist,
}
int main()
{
WSADATA w;
// man will Zugriff auf Winsock-Lib haben if (int result = WSAStartup(MAKEWORD(2,2), &w) != 0)
{
cout << "Winsock 2 konnte nicht gestartet werden! Error: " << result << endl;
return 1;
}
hostent *phe = gethostbyname("www.kernel.org");
if (phe == NULL)
{
cout << "Host konnte nicht aufgeloest werden!\n";
return 1;
}
if (phe->h_addrtype != AF_INET)
{
cout << "ungueltiger Adress-Typ!\n";
return 1;
}
if (phe->h_length != 4)
{
cout << "Ungueltiger IP-Typ!\n";
return 1;
}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == -1)
{
cout << "Socket konnte nicht erstellt werden!\n";
return 1;
}
sockaddr_in service;
service.sin_family = AF_INET; // für IPv4
service.sin_port = htons(80); // Port 80 nutzt HTTP
// Iterator char **p = phe->h_addr_list; // p mit 1. Listenelement initialisieren int result; // Ergebnis von connect do
{
// Liste zu Ende ? if (*p == NULL)
{
cout << "Verbindung fehlgeschlagen!\n";
return 1;
}
service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p);
++p;
result = connect(Socket, reinterpret_cast<sockaddr*>(&service), sizeof(service));
Hallo zusammen
ist es hiermit auch möglich normale datein wie z.b. Zip Dateien zu downloaden.
Und wenn nicht könnte mir dann evtl. jemanden sagen wie ich da vorgehen muss.
Hab mir so ein ähnliches programm geschrieben aber kann irgendwie keine zip,exe usw. Dateien downloaden bekomm dann immer nen Fehler vom Server das die Datei nicht gefunden wurde.
Hallo zusammen
ist es hiermit auch möglich normale datein wie z.b. Zip Dateien zu downloaden.
Und wenn nicht könnte mir dann evtl. jemanden sagen wie ich da vorgehen muss.
Ja, ist damit möglich. Wobei ich eher eine Library wie libcurl (http://curl.haxx.se/ ) nehmen würde.
Hallo, ich benutze Microsoft Visual Studio und habe Standard C/C++ Kenntnisse, jedoch komme einfach nicht an diesen Linker Fehlermeldungen vorbei:
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__connect@12" in Funktion "_main". main.obj
Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__inet_addr@4" in Funktion "_main". main.obj
Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__htons@4" in Funktion "_main". main.obj
Fehler 5 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__socket@12" in Funktion "_main". main.obj
Fehler 6 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAStartup@8" in Funktion "_main". main.obj
Fehler 7 fatal error LNK1120: 6 nicht aufgelöste externe Verweise. C:\Users\Jan\msvc\Sockets\Debug\Sockets.exe
Sollten Sie Nutzer der MS VisualC++ IDE sein, müssen Sie die WS2_32.lib Bibliothek dem Linker bekannt geben. Dazu gehen Sie unter Projekt->Eigenschaften->Linker und tragen, wie im Screenshot zu sehen, die Library unter "Zusätzliche Abhängigkeiten" ein:
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.