Quelltext einer Website auslesen.

Schnelle objektorientierte, kompilierende Programmiersprache.
MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: Quelltext einer Website auslesen.

Beitrag von MoonGuy » Fr Sep 23, 2011 3:07 pm

canlot hat geschrieben:
dani93 hat geschrieben:
canlot hat geschrieben:Schön und gut, aber woher nimmt er die URL? ^^ hat argv[1] was damit zu tun?
Wie gesagt, die URL wird per http://www.proggen.org/doku.php?id=c:fu ... :parameterKommandozeilenparameter übergeben.
Kann ich den auch so übergeben

Code: Alles auswählen

argv[1] = "http://www.proggen.org/?id=start";
?
argv ist vom Typ char **. Zudem ist es ein Parameter der main Funktion. Im Endeffekt sollte sprintf( argv[1], "http://www.proggen.org/?id=start" ); möglich sein, aber dann ersetze doch lieber einfach alle argv[1] durch deine Adresse:

Code: Alles auswählen

 host_info = gethostbyname("http://www.proggen.org/?id=start");
if (NULL == host_info) {
fprintf( stderr, "unknown server: %s\n", "http://www.proggen.org/?id=start");
oder ruf das Programm mittels Konsole/Verknüpfung auf.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Quelltext einer Website auslesen.

Beitrag von canlot » Fr Sep 23, 2011 3:55 pm

funzt alles nicht :(
warte auf Xin's source code
ich komme mit den Linker Settings auch nicht klar
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Quelltext einer Website auslesen.

Beitrag von Xin » Fr Sep 23, 2011 4:17 pm

canlot hat geschrieben:
dani93 hat geschrieben:
canlot hat geschrieben:Schön und gut, aber woher nimmt er die URL? ^^ hat argv[1] was damit zu tun?
Wie gesagt, die URL wird per http://www.proggen.org/doku.php?id=c:fu ... :parameterKommandozeilenparameter übergeben.
Kann ich den auch so übergeben

Code: Alles auswählen

argv[1] = "http://www.proggen.org/?id=start";
?
Ja, das könnte gehen, aber das ist eher unschön bis falsch. Also lass das lieber...

Ändere den Code, dass Du eine Variable "url" hast, der Du argv[1] zuweist und argv[1] nachfolgend entfernst.

Diese Variable kannst Du dann nach belieben ändern.

MoonGuy hat geschrieben:argv ist vom Typ char **. Zudem ist es ein Parameter der main Funktion.
Darum ist es auch eher char const * const *
MoonGuy hat geschrieben:Im Endeffekt sollte sprintf( argv[1], "http://www.proggen.org/?id=start" ); möglich sein,
Das knallt garantiert.
Du schreibst einen String in einen Dir nicht bekannten Buffer. Du weißt weder ob Du schreiben darfst, noch wie lang der Buffer ist... ganz böses Pfui...
MoonGuy hat geschrieben:oder ruf das Programm mittels Konsole/Verknüpfung auf.
Was wohl die naheliegenste Lösung wäre.


Mein Code ist vermutlich Liunx-Only... und es ist noch nicht abend genug.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Quelltext einer Website auslesen.

Beitrag von canlot » Fr Sep 23, 2011 6:52 pm

Xin hat geschrieben:Mein Code ist vermutlich Liunx-Only... und es ist noch nicht abend genug.
Und doch würde ich den gerne sehen :D
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Quelltext einer Website auslesen.

Beitrag von Xin » Sa Sep 24, 2011 3:00 pm

So... sorry, hat was länger gedauert, aber hier ist der Quelltext:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>

  /* Erstellt Verbindung */

#define SERVER_PORT 80

int main( int argc, char ** argv )
{
  long x = 5;
  struct hostent * hostent;
  struct sockaddr_in servaddr;
  int sockfd;
  char Command[8192];
  char Buffer[1024];
  
  if( argc > 1 )
  { 
    hostent = gethostbyname( argv[1] );
  
    printf("Name    : %s\n", hostent->h_name );

    printf("Addr    : %d.%d.%d.%d\n", 
              (unsigned char) hostent->h_addr_list[0][0],
              (unsigned char) hostent->h_addr_list[0][1],
              (unsigned char) hostent->h_addr_list[0][2],
              (unsigned char) hostent->h_addr_list[0][3] );
  }
  else
  { 
    printf("zuwenig Argumente\n");
    exit(0);
  }

  if( (sockfd = socket( PF_INET, SOCK_STREAM, 0 )) == -1 )
  {
    printf("Socket konnte nicht geoeffnet werden\n");
    exit(0);
  }
  else
  {
    printf("Socket wurde geoeffnet\n");

    servaddr.sin_family = AF_INET;
    servaddr.sin_port   = htons( SERVER_PORT );
    servaddr.sin_addr   = * (struct in_addr*)hostent->h_addr_list[0];   // Erste Adresse einkopieren
    
    if( connect( sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr) ) == -1 )
    {
      printf("Verbindung konnte nicht erstellt werden\n");
      exit(0);
    }
    
    printf("Verbindung besteht.\n");
  }

  sprintf(Command, "GET http://%s%s HTTP/1.0\n"
                   "Host : %d.%d.%d.%d:%s\n"
                   "Connection: Keep alive\n\n", 
                   argv[1],
                   (argv[2]) ? argv[2]
                             : "/",
                   (unsigned char) hostent->h_addr_list[0][0],
                   (unsigned char) hostent->h_addr_list[0][1],
                   (unsigned char) hostent->h_addr_list[0][2],
                   (unsigned char) hostent->h_addr_list[0][3],
                   (argv[2]) ? (argv[3])
                               ? argv[3]
                               : "80"
                             : "80" );
    
  printf("Request: %s\n", Command);
    
  write( sockfd, &Command, sizeof( Command ) );
    
  while( x = read(sockfd, &Buffer, 1024 ) )
  {
    printf("%s\n", Buffer);
  }
     
  close( sockfd );
}
Kompiliert mit gcc client.c:

Code: Alles auswählen

xin@trinity:/virt/home/xin/tutorium/server$ ./a.out proggen.org
Name    : proggen.org
Addr    : 188.40.193.143
Socket wurde geoeffnet
Verbindung besteht.
Request: GET http://proggen.org/ HTTP/1.0
Host : 188.40.193.143:80
Connection: Keep alive


HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Sep 2011 13:56:12 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Location: http://www.proggen.org/doku.php
Connection: close
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html
Das ganze ist ein Testprogramm, nicht zwangsläufig eine Musterimplementierung!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Quelltext einer Website auslesen.

Beitrag von canlot » Sa Sep 24, 2011 7:29 pm

ok Dankeschön.
Wenn ich das ganze so kompilliere und die winsocklib linke erhalte ich das:

Code: Alles auswählen

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>

    //#include <netdb.h>
    //#include <sys/types.h>
    //#include <sys/socket.h>

    #include <winsock.h>

      /* Erstellt Verbindung */

    #define SERVER_PORT 80

    int main( int argc, char ** argv )
    {
      long x = 5;
      struct hostent * hostent;
      struct sockaddr_in servaddr;
      int sockfd;
      char Command[8192];
      char Buffer[1024];

      if( argc > 1 )
      {
        hostent = gethostbyname( argv[1] );

        printf("Name    : %s\n", hostent->h_name );

        printf("Addr    : %d.%d.%d.%d\n",
                  (unsigned char) hostent->h_addr_list[0][0],
                  (unsigned char) hostent->h_addr_list[0][1],
                  (unsigned char) hostent->h_addr_list[0][2],
                  (unsigned char) hostent->h_addr_list[0][3] );
      }
      else
      {
        printf("zuwenig Argumente\n");
        exit(0);
      }

      if( (sockfd = socket( PF_INET, SOCK_STREAM, 0 )) == -1 )
      {
        printf("Socket konnte nicht geoeffnet werden\n");
        exit(0);
      }
      else
      {
        printf("Socket wurde geoeffnet\n");

        servaddr.sin_family = AF_INET;
        servaddr.sin_port   = htons( SERVER_PORT );
        servaddr.sin_addr   = * (struct in_addr*)hostent->h_addr_list[0];   // Erste Adresse einkopieren

        if( connect( sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr) ) == -1 )
        {
          printf("Verbindung konnte nicht erstellt werden\n");
          exit(0);
        }

        printf("Verbindung besteht.\n");
      }

      sprintf(Command, "GET http://%s%s HTTP/1.0\n"
                       "Host : %d.%d.%d.%d:%s\n"
                       "Connection: Keep alive\n\n",
                       argv[1],
                       (argv[2]) ? argv[2]
                                 : "/",
                       (unsigned char) hostent->h_addr_list[0][0],
                       (unsigned char) hostent->h_addr_list[0][1],
                       (unsigned char) hostent->h_addr_list[0][2],
                       (unsigned char) hostent->h_addr_list[0][3],
                       (argv[2]) ? (argv[3])
                                   ? argv[3]
                                   : "80"
                                 : "80" );

      printf("Request: %s\n", Command);

      write( sockfd, &Command, sizeof( Command ) );

      while( x = read(sockfd, &Buffer, 1024 ) )
      {
        printf("%s\n", Buffer);
      }

      close( sockfd );
    }
es kommen keine Fehlermeldung aber auf der Console wird das ausgegeben: "Zu wenig Argumente"?
Wie soll ich das mit den Argumenten händeln und wie übergebe ich die.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Quelltext einer Website auslesen.

Beitrag von Xin » Sa Sep 24, 2011 7:52 pm

Aufzurufen aus der Konsole, wie oben beschrieben.

executable.exe proggen.org

proggen.org ist dabei das Argument.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Quelltext einer Website auslesen.

Beitrag von canlot » Sa Sep 24, 2011 9:21 pm

Nach dem Aufrufen bekomme ich das:
Unbenannt.png
Eine Idee warum?
Oder einfach wegen Windoof?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Unwissenheit ist ein Segen

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Quelltext einer Website auslesen.

Beitrag von oenone » Mo Sep 26, 2011 7:16 pm

Du kannst auch eine fertige Bibliothek zum Holen von Webseiten benutzen: libcurl - http://curl.haxx.se/

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Quelltext einer Website auslesen.

Beitrag von canlot » Mo Sep 26, 2011 11:06 pm

oenone hat geschrieben:Du kannst auch eine fertige Bibliothek zum Holen von Webseiten benutzen: libcurl - http://curl.haxx.se/
Ja kenn ich schon lange klappt beim kompillieren aber nicht.
Kennst du ein guten Tutorial?
Unwissenheit ist ein Segen

Antworten