Quelltext holen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Quelltext holen

    Hallo, Coder. Also, ich habe hier ein
    Programm erstellt, mit dem möchte
    ich Quelltexte holen können, ohne
    die Seite dafür mit einem richtigen
    Browser besuchen zu müssen...

    Sieht bei mir bis dahin folgendermaßen aus:

    #include <string>
    using namespace std;

    int main () {
    cout << "source code grabber\n\n";

    cout << "Enter a url:\n";
    string url;
    cin >> url;

    string Quelltext;
    // Hier weiß ich nicht weiter... ???
    cout << Quelltext;

    int Endblinker;
    cin >> Endblinker;
    }


    Jetzt weiß ich aber nicht, wie ich das Programm den Quelltext
    holen lasse, ich find keinen Tutorialabschnitt dafür...
    Kann mir das jemand schnell erklären?

    Edit

    Nicht das jemand denkt, ich würde so ein php-File downloaden wollen LOL.
    Ich weiß genau, dass der Server nur einen dynamisch erstellten
    Quelltext anhand des php-files ausspuckt.
  • hm...ganz so einfach gehts nicht.
    Da musst du dich in der Netzwerkprogrammierung (Sockets) schlau machen.
    Schließlich musst du ja eine Netzwerk/Internetverbindung zu dem Server herstellen um über diese deine Anfrage (gib mir den Quelltext) und seine Antwort (Quelltext) zu senden/empfangen. Ganz so einfach wie du denkst ist das nicht.
    Wenn du dich aber nicht abschrecken lässt gibts Zotteljedis Tipps zur Socket-Programmierung. IMO das beste Tutorial für das Thema.
    Is auch garnich so schwierig wies aussieht ;)

    EDIT: Siehe unten
  • Hab mal nen alten Client von mir umgeschrieben, damit du siehst wie das Grundgerüst ausschaut.
    Den hab ich jetzt nur mal runtergeschrieben und mich gewundert, dass manche Server so eine "nichts-sagende" Anfrage trotzdem bearbeiten. Falls du dich näher damit auseinandersetzen willst dann guck dir mal das RFC zum HTTP an und sag mir bitte wie sowas wirklich aussehen muss.

    Quellcode

    1. #include <sys/types.h>
    2. #include <sys/socket.h>
    3. #include <netinet/in.h>
    4. #include <arpa/inet.h>
    5. #include <netdb.h>
    6. #include <iostream>
    7. using namespace std;
    8. int main(int argc, char *argv[])
    9. {
    10. int s, rc;
    11. char Buf[1024];
    12. struct sockaddr_in addr;
    13. struct hostent *host;
    14. if (argc < 2)
    15. {cout << "usage: " << argv[0] << " <addy>" << endl;return 1;}
    16. if ((s = socket (AF_INET, SOCK_STREAM, 0)) == -1) // Socket anlegen
    17. {cerr << "Socket FEHLER!" << endl;return 2;}
    18. if (!inet_aton(argv[1], &addr.sin_addr)) // Falls keine IP angegeben wurde:
    19. {
    20. host = gethostbyname(argv[1]); // Hol die IP-Addy vom Host
    21. if (!host)
    22. {cerr << "gethostbyname() FEHLER!" << endl;return 3;}
    23. addr.sin_addr = *(struct in_addr*)host->h_addr;
    24. }
    25. addr.sin_family = AF_INET;
    26. addr.sin_port = htons(atoi("80"));
    27. if (connect(s, (struct sockaddr*)&addr,sizeof(addr)) == -1) // Verbinden
    28. {cerr << "Connect FEHLER!" << endl;return 4;}
    29. send(s, "GET / \n", 7, 0); // Einfach mal geraten ;) - Anfrage senden
    30. while((rc = recv(s, Buf, sizeof(Buf) - 1, 0)) > 0) // Falls Antwort:
    31. {
    32. if(rc > 1)
    33. Buf[rc] = '\0'; // \0 an Stringende
    34. cout << Buf; // Antwort ausgeben
    35. }
    36. close(s); // Socket schliessen
    37. return 0;
    38. }
    Alles anzeigen

    Für Windows muss das dann eben noch angepasst werden.
  • "newb" schrieb:

    Für Windows muss das dann eben noch angepasst werden.

    Ich hab dir doch oben den Link zu den Socket Tipps gegeben. Wenn du dir das Kapitel "Voraussetzungen" durchliest dann weisst du, wie man es nach Windows portiert.
    Wenn du trotzdem nicht weiterkommst dann poste deinen Versuch und ich guck nochmal drüber. Hab hier nicht die Möglichkeit es selbst zu probieren.
  • Ich weiss nich was du willst ;)
    Wenn du unbedingt Socket-Klassen benutzen willst, dann kannst du dich ja nach C++ Socket libs im Internet umschauen oder dir selber schreiben. Aber ich denke nicht, dass die wirklich notwendig sind. Wir schreiben hier ja schliesslich nicht in Java.
    Und so groß ist das Projekt wirklich nicht ;)
  • OK, dann mach ichs dir eben:
    Ich lese bei den Voraussetzungen und sehe, dass bei Windows die Sockets "aufgewärmt" werden müssen. Dann steht da noch, dass die header anders aussehen. Also schreib ich das in den Code. Ausserdem heisst der winsocket SOCKET. Dann gibts kein inet_aton(), also benutze ich inet_addr(). Die DNS-Anfrage klau ich mir dann hier.
    aus "close(s);" mach ich "WSACleanup();"
    Und das ganze sieht dann so aus:

    Quellcode

    1. #include <winsock.h>
    2. #include <windows.h>
    3. #include <iostream>
    4. using namespace std;
    5. int main(int argc, char *argv[])
    6. {
    7. SOCKET s;
    8. int rc;
    9. char Buf[1024];
    10. char serverip[20];
    11. struct sockaddr_in addr;
    12. struct hostent *host;
    13. WSADATA wsa;
    14. if (WSAStartup(MAKEWORD(1, 1), &wsa))
    15. {
    16. printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
    17. return EXIT_FAILURE;
    18. }
    19. if (argc < 2)
    20. {cout << "usage: " << argv[0] << " <addy>" << endl;return 1;}
    21. if ((s = socket (AF_INET, SOCK_STREAM, 0)) == -1) // Socket anlegen
    22. {cerr << "Socket FEHLER!" << endl;return 2;}
    23. host = gethostbyname(argv[1]);
    24. sprintf(serverip, "%u.%u.%u.%u",
    25. (unsigned char) host->h_addr_list[0][0], (unsigned char) host->h_addr_list[0][1],
    26. (unsigned char) host->h_addr_list[0][2], (unsigned char) host->h_addr_list[0][3]);
    27. addr.sin_addr.s_addr = inet_addr(serverip);
    28. addr.sin_family = AF_INET;
    29. addr.sin_port = htons(atoi("80"));
    30. if (connect(s, (struct sockaddr*)&addr,sizeof(addr)) == -1) // Verbinden
    31. {cerr << "Connect FEHLER!" << endl;return 4;}
    32. send(s, "GET / \n", 7, 0); // Einfach mal geraten Wink - Anfrage senden
    33. while((rc = recv(s, Buf, sizeof(Buf) - 1, 0)) > 0) // Falls Antwort:
    34. {
    35. if(rc > 1)
    36. Buf[rc] = '\0'; // \0 an Stringende
    37. cout << Buf; // Antwort ausgeben
    38. }
    39. WSACleanup();
    40. return 0;
    41. }
    Alles anzeigen

    So müssts jetzt aber laufen...