Mit WSA auf google.de zugreifen
-
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); }
-
ich liebe dich @spicker@

es geht endlich
aber warum hat das ganze bei nem freund vonmir funktioniert
mfg
@night@
-
heyho,
bis jetzt funktioniert zwar nicht alles so wie es soll,aber das ist erstmal egal.
Mein größtes Problem wär folgendes:
Wenn ich ein 2. Mal versuche eine Verbindung herzustellen, gibt mir die Funktion connect() nur SOCKET_ERROR zurück, obwohl ich fünf Sekunden davor die Verbindung per closesocket abgebrochen habe.
Gibt es hier eine Art spoiler, damit nicht immer der gesamte Platz auf der Seite eingenommen wird???#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> #include <fstream> #include <sstream> using namespace std; string StringBetween(const string& input, const string& left, const string& right) { size_t posLeft, posRight; posLeft = input.find(left); posRight = input.find(right); if (posLeft == string::npos || posRight == string::npos) { return ""; // Nicht gefunden } posLeft += left.length(); posRight += right.length(); string ergebnis1 = input.substr(posLeft, input.length() - right.length() - left.length()); int formel = (input.find(right) - posLeft); string ergebnis2 = ergebnis1.substr(0, formel); return ergebnis2; } 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 getDataforfirst() { int MAX_LENGTH = 8000; char crlf = 13; char buffer[MAX_LENGTH]; string data; data = "GET / HTTP/1.0\r\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)\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" "Keep-Alive: 300\r\n" "Connection: keep-alive\r\n\r\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 firstcall() { 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 = getDataforfirst(); char buffer[10000]; strcpy(buffer, data.c_str()); 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... /* ofstream f("C:/test.html"); for(;;) { gebaus(buffer2); rc = recv(s, buffer2, sizeof(buffer2), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } f.write(buffer2, rc); } */ string source; do { gebaus(buffer2); rc = recv(s, buffer2, sizeof(buffer2), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } source.assign(buffer2); } while (!source.find("</script>")); do { rc = recv(s, buffer2, sizeof(buffer2), 0); } while (!rc||rc==-1); closesocket(s); string img = StringBetween(source, "<img>", "</img>"); cout << "imagename=" << img << endl; //==================================================================>>>> ssid erfolgreich abgezogen data = "GET / HTTP/1.0\r\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)\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" "Keep-Alive: 300\r\n" "Connection: keep-alive\r\n\r\n"; Sleep(5000); rc = connect(s, (SOCKADDR*)&addr, sizeof(sockaddr)); if (rc==SOCKET_ERROR) { cout << "Fehler beim 2.Verbinden" << endl; system("pause"); return -1; } rc = send(s, data.c_str(), data.length(), 0); if (rc==SOCKET_ERROR) { cout << "Fehler beim Einloggen mir SSID" << endl; system("pause"); return -1; } else { cout << "Daten wurden zum 2.Mal erfolgreich gesendet!" << endl; } char buffer3[8000]; ofstream f("C:/test.html"); for(;;) { gebaus(buffer3); rc = recv(s, buffer3, sizeof(buffer3), 0); if(rc == -1) { cout << "Fehler: " << WSAGetLastError() << '\n'; break; } if(rc == 0) { break; } f.write(buffer3, rc); } } int main(int argc, char *argv[]) { firstcall(); system("pause"); }mfg
@night@
-
char buffer2[5000]; ... delete &buffer2;
