Mit WSA auf google.de zugreifen
-
Guten Abend.
Ich hoffe ich bin in diesem Unterforum richtig...
Wie die Überschrift schon sagt, würde ich gerne mit WSA auf google.de zugreifen und den Quelltext runterladen.
Klappt auch alles ganz gut, bis auf das Empfangen...
Google will mir nichts schicken...#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> using namespace std; int WSAStart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } void gebaus(char array[]) { for (int i=0;array[i]!=0;i++) { cout << array[i]; } cout << endl; } string getData() { int MAX_LENGTH = 8000; char crlf = 13; char buffer[MAX_LENGTH]; string data; data = "GET / HTTP/1.1\n" "Host: www.google.de\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729)\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n" "Keep-Alive: 300\n" "Connection: keep-alive\n"; return data; } int subfunc() { SOCKET s; if (WSAStart()!=0) { cout << "WSA konnte nicht gestartet werden!" << endl; system("pause"); return -1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s==INVALID_SOCKET) { cout << "Socket konnte nicht ertellt werden!" << endl; system("pause"); return -1; } sockaddr_in addr; memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("74.125.39.99"); long rc = connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); if (rc==SOCKET_ERROR) { cout << "Verbindung konnte nicht hergestllet werden!" << endl; system("pause"); return -1; } else { cout << "Verbindung wurde erfolgreich hergestllt!" << endl; } string data = getData(); char buffer[5000]; strcpy(buffer, data.c_str()); rc = send(s, buffer, sizeof(buffer), 0); //senden if (rc==SOCKET_ERROR) { cout << "Fehler beim Senden der Daten!" << endl; system("pause"); return -1; } else { cout << "Daten wurden erfolgreich gesendet!" << endl; } char buffer_recv[5000]; recv(s, buffer_recv, 100,0); gebaus(buffer_recv); } int main(int argc, char *argv[]) { subfunc(); system("pause"); }Kompilliert habe ich das Programm mit DevC++
mfg
@night@
-
Hallo
WSA, google, DevC++? Nein dann bist du hier ganz sicher falsch.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Guten Abend @night@, der Server muss erkennen das dein Request zu Ende ist. Du könntest ja noch zusätzliche Header-Zeile senden wollen.
=> Mit einer leeren Zeile sagst du ihm das der Request zu Ende ist.
"Connection: keep-alive\n" "\n"; // <- leere Zeile
-
danke, es funktioniert jetzt

2. Frage:
Wie kann ich den Empfang so schreiben, dass er den gesamten Google-Quelltext empfängt???
Im Moment empfängt das Programm ja nur die ersten 100 Zeichen...
€dit:
Wenn ich den Source in eine Datei schreiben will schreibt nicht alles... Ich benutze folgende Befehe:fstream file; file.open("hello.htm", ios::out); for (int i=0;i<1000;i++) { file << buffer_recv[i]; } file <<endl; file.close();Warum schreibt er nicht alles???
mfg
@night@
-
Ich würde dir empfehlen eine HTTP 1.0-Abfrage zu machen und den Keep-Alive und Connection Header rauszunehmen. Dann schließt der Server die Verbindung, wenn er alles übertragen hat. Sprich du kannst solange recv aufrufen bis 0 zurückgegeben wird.
Bei HTTP 1.1 müsste man einiges mehr beachten, z.B. Chunked transfer encoding.
-
Kann mir bitte jemand ein kleines Stück Code code... Ich hab keine Ahnung wie ich mit HTTP 1.0 darauf warte, dass er nur noch 0 schickt^^
Hier mein Code:if (rc==SOCKET_ERROR) { cout << "Fehler beim Senden der Daten!" << endl; system("pause"); return -1; } else { cout << "Daten wurden erfolgreich gesendet!" << endl; } char buffer_recv[5000]; recv(s, buffer_recv, 1000,0); char source[9000]; strcpy(source, buffer_recv); while (buffer_recv[0]!=0) { recv(s, buffer_recv, 1,0); strcat(source, buffer_recv); }
-
Du musst nicht den Inhalt des Puffers auf 0'en überprüfen, sondern den Rückgabewert (return) von recv.
-
Das programm bricht jetzt wahrscheinlich das Empfangen ab, aber aus irgendeinem Gund schließt sich das Programm immer, wenn es fertig empfangen hat^^
#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> #include <fstream> using namespace std; int WSAStart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } int cstringlen(char array[]) { int counter=0; while (array[counter]!=0) { counter++; } return counter; } void gebaus(char array[]) { for (int i=0;array[i]!=0;i++) { cout << array[i]; } cout << endl; } string getData() { int MAX_LENGTH = 8000; char crlf = 13; char buffer[MAX_LENGTH]; string data; data = "GET / HTTP/1.0\n" "Host: localhost\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729)\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n" "Keep-Alive: 300\n" "Connection: keep-alive\n\n"; return data; } int login() { SOCKET s; if (WSAStart()!=0) { cout << "WSA konnte nicht gestartet werden!" << endl; system("pause"); return -1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s==INVALID_SOCKET) { cout << "Socket konnte nicht ertellt werden!" << endl; system("pause"); return -1; } sockaddr_in addr; memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("74.125.39.99"); long rc = connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); if (rc==SOCKET_ERROR) { cout << "Verbindung konnte nicht hergestllet werden!" << endl; system("pause"); return -1; } else { cout << "Verbindung wurde erfolgreich hergestllt!" << endl; } string data = getData(); char buffer[5000]; strcpy(buffer, data.c_str()); rc = send(s, buffer, sizeof(buffer), 0); //senden if (rc==SOCKET_ERROR) { cout << "Fehler beim Senden der Daten!" << endl; system("pause"); return -1; } else { cout << "Daten wurden erfolgreich gesendet!" << endl; } char buffer_recv[5000]; recv(s, buffer_recv, 1000,0); char source[9000]; strcpy(source, buffer_recv); while (rc!=0) { rc = recv(s, buffer_recv, 1,0); strcat(source, buffer_recv); } cout << "Fertig!" << endl; system("pause"); fstream file; file.open("hello.htm"); for (unsigned int i=0;source[i]!=0;i++) { file << source[i]; } file << endl; file.close(); } void stradd(char array1[], char array2[]) { int len1 = cstringlen(array1); int len2 = cstringlen(array2); char ergebnis[len1+len2+1]; strcpy(ergebnis, array1); for (int i=0;array2[i]!=0;i++) { ergebnis[len1+i] = array2[i]; } gebaus(ergebnis); } int main(int argc, char *argv[]) { login(); system("pause"); }mfg
@night@
-
gitb es irgendwo nen Beispiel,wo man mit WSA auf eine Webseite zugreift???
ich würd gern mal nen bisschen spicken
mfg
@night@
-
-
Ich hab ja schon mal mit WSA nen Server und Client programmiert, aber ich hab ja speziell Probleme beim arbeiten mit Webseiten^^
mfg
@night@
-
// Fehlerbehandlung entfernt damit es kürzer ist ^^ #include <iostream> #include <winsock2.h> #include <windows.h> using namespace std; int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa); SOCKET s = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("209.85.135.104"); connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); string request = "GET / HTTP/1.0\r\n" "Host: www.google.de\r\n" "\r\n"; send(s, request.c_str(), request.length(), 0); char buffer[4096]; for(;;) { int rc = recv(s, buffer, sizeof(buffer), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } cout.write(buffer, rc); } }
-
Danke

es geht endlich
mfg
@night@
-
ich hab jetzt folgendes Problem:
Aus irgendeinem Grund gibt google mir immer anderen quelltext...
manchmal funktionierts, dann wieder nicht, dann nur zum Teil
#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> #include <fstream> using namespace std; int WSAStart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } int cstringlen(char array[]) { int counter=0; while (array[counter]!=0) { counter++; } return counter; } void gebaus(char array[]) { for (int i=0;array[i]!=0;i++) { cout << array[i]; } cout << endl; } string getData() { int MAX_LENGTH = 8000; char crlf = 13; char buffer[MAX_LENGTH]; string data; data = "GET / HTTP/1.0\n" "Host: www.google.de\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729)\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n" "Keep-Alive: 300\n" "Connection: keep-alive\n\n"; return data; } void WSArecv(SOCKET s, char buffer[]) { int rc; for(;;) { rc = recv(s, buffer, sizeof(buffer), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } } // ende for-schleife } int login() { SOCKET s; if (WSAStart()!=0) { cout << "WSA konnte nicht gestartet werden!" << endl; system("pause"); return -1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s==INVALID_SOCKET) { cout << "Socket konnte nicht ertellt werden!" << endl; system("pause"); return -1; } sockaddr_in addr; memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("74.125.77.104"); long rc = connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); if (rc==SOCKET_ERROR) { cout << "Verbindung konnte nicht hergestllet werden!" << endl; system("pause"); return -1; } else { cout << "Verbindung wurde erfolgreich hergestllt!" << endl; } string data = getData(); char buffer[5000]; strcpy(buffer, data.c_str()); rc = send(s, buffer, sizeof(buffer), 0); //senden if (rc==SOCKET_ERROR) { cout << "Fehler beim Senden der Daten!" << endl; system("pause"); return -1; } else { cout << "Daten wurden erfolgreich gesendet!" << endl; } char buffer2[5000]; //==================================>Empfangen... for(;;) { rc = recv(s, buffer2, sizeof(buffer2), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } } // ende for-schleife string source = ""; source.assign(buffer2); cout << source << endl; } void stradd(char array1[], char array2[]) { int len1 = cstringlen(array1); int len2 = cstringlen(array2); char ergebnis[len1+len2+1]; strcpy(ergebnis, array1); for (int i=0;array2[i]!=0;i++) { ergebnis[len1+i] = array2[i]; } gebaus(ergebnis); } int main(int argc, char *argv[]) { login(); system("pause"); }
-
Der Teil ist hier auf jeden Fall falsch:
char buffer[5000]; strcpy(buffer, data.c_str()); rc = send(s, buffer, sizeof(buffer), 0); //sendenDenk mal über das sizeof(buffer) nach.
-
void stradd(char array1[], char array2[]) { int len1 = cstringlen(array1); int len2 = cstringlen(array2); char ergebnis[len1+len2+1]; strcpy(ergebnis, array1); for (int i=0;array2[i]!=0;i++) { ergebnis[len1+i] = array2[i]; } gebaus(ergebnis); }Uhhh....das akzeptiert der Compiler? Machs besser nicht.
-
Jo würd ich auch nicht machen, das geht nämlich nur beim g++. (Variable length array).
Verzichte am besten ganz auf die C-Strings wenn du eh die String-Klasse aus C++ nutzt.
-
es funktioniert jetzt schon besser^^
Allerdings kriege ich nicht den gesamten Google-Code...#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> #include <fstream> using namespace std; int WSAStart() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } int cstringlen(char array[]) { int counter=0; while (array[counter]!=0) { counter++; } return counter; } void gebaus(char array[]) { for (int i=0;array[i]!=0;i++) { cout << array[i]; } cout << endl; } string getData() { int MAX_LENGTH = 8000; char crlf = 13; char buffer[MAX_LENGTH]; string data; data = "GET / HTTP/1.0\n" "Host: www.google.de\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729)\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n" "Keep-Alive: 300\n" "Connection: keep-alive\n\n"; return data; } void WSArecv(SOCKET s, char buffer[]) { int rc; for(;;) { rc = recv(s, buffer, sizeof(buffer), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } } // ende for-schleife } int login() { SOCKET s; if (WSAStart()!=0) { cout << "WSA konnte nicht gestartet werden!" << endl; system("pause"); return -1; } s = socket(AF_INET, SOCK_STREAM, 0); if (s==INVALID_SOCKET) { cout << "Socket konnte nicht ertellt werden!" << endl; system("pause"); return -1; } sockaddr_in addr; memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("74.125.77.104"); 62.146.187.145 long rc = connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); if (rc==SOCKET_ERROR) { cout << "Verbindung konnte nicht hergestllet werden!" << endl; system("pause"); return -1; } else { cout << "Verbindung wurde erfolgreich hergestllt!" << endl; } string data = getData(); char buffer[10000]; strcpy(buffer, data.c_str()); int len = rc = send(s, data.c_str(),data.length(), 0); //senden if (rc==SOCKET_ERROR) { cout << "Fehler beim Senden der Daten!" << endl; system("pause"); return -1; } else { cout << "Daten wurden erfolgreich gesendet!" << endl; } char buffer2[5000]; //==================================>Empfangen... for(;;) { rc = recv(s, buffer2, sizeof(buffer2), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } } // ende for-schleife gebaus(buffer2); fstream f; f.open("hello.htm"); for (int i=0;buffer2[i]!=0;i++) { f << buffer2[i]; } f << endl; f.close(); } int main(int argc, char *argv[]) { login(); system("pause"); }mfg
@night@
-
ofstream f("C:/test.html"); for(;;) { rc = recv(s, buffer2, sizeof(buffer2), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } f.write(buffer2, rc); }