[C/C++] Browser mit Proxy

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von schiene, 2. Dezember 2006 .

Schlagworte:
  1. 2. Dezember 2006
    Browser mit Proxy

    moin!
    also ich möchte einen simplen Webbrowser der über einen http-proxy verbindung ins internet aufnimmt. Und das ganze mit C.
    Den normalen simplen Browser habe ich schon, nur hab ich nichts gefunden wie man nun über einen proxy ins Internet geht. Achso was ich vielleicht noch erwähnen sollte, das ganze soll auf einem Linuxsystem laufen also keine winsocklösungen :tongue:

    Code:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    
    main(){
     int socket_nummer;
     int laenge;
     int ergebnis;
     int anzahl;
     struct sockaddr_in adresse;
     char empfangene_zeichen[65000];
     
     unsigned short int portnummer = 80;
     char ip_adresse[] = "192.168.1.1";
     
     char befehl[] = "GET /index.php HTTP/1.1\r\nHost: PC\r\n\r\n";
     
     socket_nummer = socket(AF_INET, SOCK_STREAM, 0);
     
     adresse.sin_family = AF_INET;
     adresse.sin_addr.s_addr = inet_addr(ip_adresse);
     adresse.sin_port = htons(portnummer);
     laenge = sizeof(adresse);
     
     ergebnis = connect(socket_nummer, (struct sockaddr*)&adresse, laenge);
     
     printf("\n Verbindung zu IP %s an Port %d", ip_adresse, portnummer);
     
     if (ergebnis == -1){
     perror(" Keine Verbindung erfolg: ");
     }else{
     printf("\n Verbindung erfolgt, sende HTTP-Befehl:\n\n/%s", befehl);
     anzahl = write(socket_nummer, befehl, sizeof(befehl));
     
     printf(" es wurden %d Zeichen gesendet", anzahl);
     
     anzahl = read(socket_nummer, empfangene_zeichen, sizeof(empfangene_zeichen));
     
     printf("\n es wurden %d Zeichen empfangen: \n\n%s", anzahl, empfangene_zeichen);
     
     if (strstr(empfangene_zeichen, "200 OK") == NULL){
     printf("\n Der Server hat die Datei nicht gesendet");
     }else{
     printf("\n Der Server hat die Datei gesendet");
     }
     }
     
     close(socket_nummer);
     
     printf("\n Programm beendet\n\n");
    }
    
    ich bedanke mich schonmal für eure mühe

    greetz schiene
     
  2. 2. Dezember 2006
    AW: Browser mit Proxy

    Und wie stellst du dir das Parsen von HTML vor ? Du weisst, dass das keine Arbeit von 2 Tagen ist oder ?
     
  3. 2. Dezember 2006
    AW: Browser mit Proxy

    naja darum geht es jetzt ja überhaupt nicht... es geht ja nur um das prinzip die daten vom server über einen proxy anzufordern und zu empfangen.

    mich würde auch mal interessieren, bin auch mal auf der suche gewesen hab aber nix gefunden

    greez myth
     
  4. 2. Dezember 2006
    AW: Browser mit Proxy

    Bevor man sich ueberlegt was man machen will informiert man sich,
    daher frag ich ihn lieber ob er ueberhaupt irgendwo drauf kann (ausser runterladen von Dateien).
     
  5. 2. Dezember 2006
    AW: Browser mit Proxy

    Hi,

    fork() und select() sind die Stichwoerter.

    Mfg,

    Kolazomai
     
  6. 3. Dezember 2006
    AW: Browser mit Proxy

    das parsen ist jetzt ertsmal nebensache ich möchte einfach erstmal eine datei über einen proxy bekommen.

    könntest du mir dasbeispielhaft zeigen wie das dann funktioniert, wenn du damit schon gearbeitet hast, Kolazomai
    das wäre nett
     
  7. 3. Dezember 2006
    AW: Browser mit Proxy

    Du sendest ein HTTP Get an den Proxy anstatt an den urspruenglichen Server und der Proxy uebermittelt dir die Daten zurueck.
     
  8. 3. Dezember 2006
    AW: Browser mit Proxy

    Hi,

    wenn du einen Proxy bauen willst, so wie ich das jetz verstehe, musst du ja gleichzeitig sowohl auf den Clienten, als auch auf die Verbindungen, die du aufgebaut hast, 'recv()' callen.
    Da recv() aber blockiert und es non-blocking zu setzen Bloedsinn ist, musst du dir mit etwas anderem helfen.
    Und da sind die Stichwoerter fork() und select().

    1. fork()

    fork() erstellt ( aber nur unter *nix ) einen sogenannten 'Child'-Prozess.
    Damit kannste dann, je nach Anzahl der Childs, praktisch sehr viele Sachen gleichzeitig machen.

    Nachteil:
    Man kann das ganze Ausnutzen ( als Client ) und 100 'Child'-Prozesse erstellen. Dann kackt dein Server meistens ab.

    Wenn du Apache auf einem Unix-Server installierst, und startest, und danach mal ps -A eingibst, dann wirste sehen, dass da nicht 1mal 'Apache' steht, sondern so 3-6 mal. Das kommt davon, dass Apache fork() (mit Einschraenkungen) benutzt

    2. select()

    select() ist so eine Sache fuer sich.
    Wenn mans mal verstanden hat, und nicht nur, wie es funktioniert, sondern auch, wie man es benutzt, ist es ziemlich geil.

    Zur kurzen Einfuehrung:
    Select nimmt sowas wie ein Array ( heisst fd_set ) aus FDs ( FileDescriptoren ), und du kannst dann schauen, welcher von den FDs gesetzt ( heisst: Da sind Daten, die empfangen werden wollen ) ist. Das ganze baut man meistens in eine Endlos-Schleife.

    Die Idee ist jetzt ganz einfach:
    1. Du machst ein Array aus Sockets, die zu Servern connecten sollen. ( A )
    2. Du machst einen Socket ( oder mehrere, wenn du willst ), der / die die Verbindung(en) zu einem Client(en) annehmen soll(en). ( B )

    Dann haust du einfach alle Sockets von A, falls sie nicht ein (-1)-Socket sind, in das fd_set, und dann alle von B, wieder mit der Bedingung.
    Danach select() ausfuehren, und gucken, welche gesetzt sind und dementsprechend agieren.

    Ausserdem ist select() noch crossplatform, das heisst, du kannst es auf *nix wie auf Windows-Basis laufen lassen.

    Nachteil:
    Wie du das mit connect()-Timeout loest oder wenn der Server (gegenueber) sehr langsam ist, weiss ich nicht.
    Vielleicht geht das mit der Timeout-Funktion von select() ( ja, das kann sehr viel ), oder mit bestimmten Socket-Optionen.

    ---

    Man kann sagen, dass jede MehrClientenAnwendung auf *nix-System entweder select() oder fork() benutzt, um der Sache Herr zu werden.

    Mfg,

    Kolazomai
     
  9. 3. Dezember 2006
    AW: Browser mit Proxy

    also ich möchte keinen proxy bauen, ich möchte über einen proxy daten aus dem internet bzw. in diesem beispiel jetzt von einer seite(webserver) bekommen

    aber trotzdem danke Kolazomai war eine schöne erklärung

    wie genau müsste die anfrage dann aussehn bzw. was muss ich an dem code dann verändern?
     
  10. 6. Dezember 2006
    AW: Browser mit Proxy

    also wenn es ein einfacher HTTP-Request sein soll dann geht das so:

    Code:
    GET index.html HTTP/1.0\nHost: www.google.de\n\n
    
    im grunde genau so wie du es shcon in deinem Code stehen hast.
    versuche es mal und schicke das ganze an irgendeinen proxy (port musste natürlich anpassen)
    allerdings darfst du als Host in dem HTTP-Request nicht den Proxy sondern die Homepage angeben die du über den proxy aufrufen möchtest.
    sollte stimmen wenn ich richtig liege XD

    greez myth
     
  11. 7. Dezember 2006
    AW: Browser mit Proxy

    [X] Erledigt.

    ~closed~

    Mfg,

    Kolazomai
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.