HTML-Seite parsen mit C

Hi Leute,

ich möchte eine Verwaltung für meinen Router (Sinus 154 DSL) in C schreiben. Ich habe schon längere Zeit gegoogelt und finde leider keine Ansätze. Das Einzige, das ich bisher vermute, ist dass ich mit Sockets (wovon ich leider noch nicht viel Ahnung habe) und HTTP-Request/-Response arbeiten muss.

Kann mir dabei jemand auf die Sprünge helfen? Irgendwelche Libraries, Beispiele, Erläuterungen, vllt. sogar Tutorials?

Danke im Vorraus

Liebe Grüße
Woosh

Hallo,

ich möchte eine Verwaltung für meinen Router (Sinus 154 DSL)
in C schreiben.

Was meinst du denn mit „Verwaltung“? Eine Art Fernsteuerung?
Wenn ja: C ist dafür ziemlich ungeeignet, Perl in Verbindung mit WWW::Mechanize macht das deutlich einfacher (siehe http://search.cpan.org/perldoc?WWW::Mechanize z.B.).

Du könntest auch nachschauen, ob dein Router vielleicht ein Telnet-Interface hat, das lässt sich leichter automatisieren.

Grüße,
Moritz

Hi Moritz,

erstmal vielen Dank für deine Antwort :smile:

Was meinst du denn mit „Verwaltung“? Eine Art Fernsteuerung?

So in etwa. Ich will zuallererst einmal mein Passwort an die Login-Seite meiner Routerkonfiguration senden. Dann will ich zum Beispiel im C-Programm ausgeben, welche Einstellungen im Moment im Bereich „Sicherheit“ vorgenommen wurden.
Wenn ich es ersteinmal geschafft habe, die passwortgeschützten HTML-Seiten der Konfiguration zu parsen bzw. im C-Programm auszugeben, will ich zusätzlich versuchen, die Konfiguration z. B. per „POST“ zu ändern.
Ich weiß, dass das ziemlich schwer ist. Aber ich bin überzeugt davon, dass das klappt (wenn es ja sogar in PHP geht :wink: hihi). Die Frage ist nur WIE. Darauf konnte ich bisher keine Antworten finden :frowning:

Wenn ja: C ist dafür ziemlich ungeeignet, Perl in Verbindung
mit WWW::Mechanize macht das deutlich einfacher (siehe
http://search.cpan.org/perldoc?WWW::Mechanize z.B.).

Ich versuche im Moment, mich auf C zu spezifizieren. Dieses kleine Projekt dient eigentlich nur dazu, mich mehr mit der Sprache zu beschäftigen. Trotzdem werde ich mir deinen Link gerne mal ansehen. Perl interessiert mich auch :wink:

Du könntest auch nachschauen, ob dein Router vielleicht ein
Telnet-Interface hat, das lässt sich leichter automatisieren.

Daran habe ich auch schon gedacht, allerdings steht weder im Handbuch etwas von Telnet, noch sagt ein Portscan positives. Es sind lediglich Port 21 (leider weiß ich nicht, wofür dieser ist!) und der 80er frei. Allerdings kann ich per HTTP NUR über den 80er Port zugreifen. Deshalb verwirrt mich der scheinbar sinnlose offene Port 21 etwas.

Ich hoffe, ich erhalte noch weitere Antworten :smile:

Liebe Grüße
Woosh

Hallo,

Was meinst du denn mit „Verwaltung“? Eine Art Fernsteuerung?

So in etwa. Ich will zuallererst einmal mein Passwort an die
Login-Seite meiner Routerkonfiguration senden. Dann will ich
zum Beispiel im C-Programm ausgeben, welche Einstellungen im
Moment im Bereich „Sicherheit“ vorgenommen wurden.
Wenn ich es ersteinmal geschafft habe, die passwortgeschützten
HTML-Seiten der Konfiguration zu parsen bzw. im C-Programm
auszugeben, will ich zusätzlich versuchen, die Konfiguration
z. B. per „POST“ zu ändern.
Ich weiß, dass das ziemlich schwer ist. Aber ich bin überzeugt
davon, dass das klappt (wenn es ja sogar in PHP geht :wink:
hihi). Die Frage ist nur WIE. Darauf konnte ich bisher keine
Antworten finden :frowning:

Also prinzipiell sendet der Browser pro Seitenaufruf einen oder mehrere HTTP-Requests an den Server, und die musst du in deinem Programm „nachbauen“. Und dann das Ergebnis auswerten.

Die Frage ist, wie viel zu selbst machen willst, und wie viel du durch externe Bibliotheken erledigen willst.
Es gibt Bibliotheken, die dir einiges an Arbeit mit den HTTP-Requests abnehmen, z.B. libcurl.

Den HTML-Parser könntest du ganz von Hand bauen (viel Aufwand), oder einen Parser-Generator wie yacc/bison verwenden (nicht mehr soo viel Arbeit, aber immer noch einiges), oder einen HTML-Parser suchen (gibts sicher auch, kenne jetzt keinen für C).

Wenn ja: C ist dafür ziemlich ungeeignet, Perl in Verbindung
mit WWW::Mechanize macht das deutlich einfacher (siehe
http://search.cpan.org/perldoc?WWW::Mechanize z.B.).

Ich versuche im Moment, mich auf C zu spezifizieren. Dieses
kleine Projekt dient eigentlich nur dazu, mich mehr mit der
Sprache zu beschäftigen.

Ok, dann werde ich dich nicht weiter von C abhalten :wink:

Du könntest auch nachschauen, ob dein Router vielleicht ein
Telnet-Interface hat, das lässt sich leichter automatisieren.

Daran habe ich auch schon gedacht, allerdings steht weder im
Handbuch etwas von Telnet, noch sagt ein Portscan positives.
Es sind lediglich Port 21 (leider weiß ich nicht, wofür dieser
ist!)

ftp, üblicherweise.

Grüße,
Moritz

Hallo,

Hi :wink:

Die Frage ist, wie viel zu selbst machen willst, und wie viel
du durch externe Bibliotheken erledigen willst.
Es gibt Bibliotheken, die dir einiges an Arbeit mit den
HTTP-Requests abnehmen, z.B. libcurl.
Den HTML-Parser könntest du ganz von Hand bauen (viel
Aufwand), oder einen Parser-Generator wie yacc/bison verwenden
(nicht mehr soo viel Arbeit, aber immer noch einiges), oder
einen HTML-Parser suchen (gibts sicher auch, kenne jetzt
keinen für C).

Ich will vorerst so viel wie möglich an Bibliotheken benutzen. Wenn erstmal alles klappt, werde ich versuchen, mehr SELBST zu basteln :smile:

ftp, üblicherweise.

Dachte ich zuerst auch. Aber ein Verbindungsaufbau mit einem FTP-Client schlug fehl. In der Bedienungsanleitung des Routers stand darüber auch nichts.

Ich versuche immer noch, ein Beispiel für HTTP-Request, HTTP-Response und das Parsen zu finden. Leider bisher vergeblich :frowning:

Liebe Grüße
Woosh

Hallo,

Ich versuche immer noch, ein Beispiel für HTTP-Request,
HTTP-Response

Also wenn du das eine Bibliothek machen lassen willst, musst du dich da nicht im Detail auskennen.

Ich kann dir trotzdem mal ein Auszug aus einer HTTP-Verbindung geben:

Request:

GET / HTTP/1.1
Host: sg

Der Request hört mit einer Leerzeile auf.

Und das schickt der Server zurück:

HTTP/1.1 200 OK
Date: Thu, 06 Dec 2007 18:39:47 GMT
Server: Apache/2.2.3 (Debian)
Content-Location: index.shtml.en
Vary: negotiate,accept-language
TCN: choice
Accept-Ranges: bytes
Content-Script-Type: text/javascript
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Content-Language: en

Danach kommt auch wieder eine Leerzeile, und dann die HTML-Ausgabe.

und das Parsen zu finden. Leider bisher
vergeblich :frowning:

Das Parsen ist nicht einfach. Wie viel Programmiererfahrung hast du denn?

Grüße,
Moritz

Hallo Moritz,

Also wenn du das eine Bibliothek machen lassen willst, musst
du dich da nicht im Detail auskennen.

Das will ich für den Anfang auch nicht. Wenn ich das Programm fertig habe, werde ich mir trotzdem mal die Bibliotheken genauer ansehen und evtl. sogar selbst versuchen, etwas Ähnliches nachzuprogrammieren.

Ich kann dir trotzdem mal ein Auszug aus einer HTTP-Verbindung
geben:

Request:

GET / HTTP/1.1
Host: sg

  • Leerzeile
    Mich würde jetzt zum Beispiel interessieren, wie soetwas in C aussehen würde. Hierfür kann man also libcurl nutzen?

Und das schickt der Server zurück:

HTTP/1.1 200 OK
Date: Thu, 06 Dec 2007 18:39:47 GMT
Server: Apache/2.2.3 (Debian)
Content-Location: index.shtml.en
Vary: negotiate,accept-language
TCN: choice
Accept-Ranges: bytes
Content-Script-Type: text/javascript
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Content-Language: en

  • Leerzeile + HTML-Ausgabe
    Weißt du auch für das Empfangen hierfür eine Bibliothek?

Das Parsen ist nicht einfach. Wie viel Programmiererfahrung
hast du denn?

Das Parsen habe ich bisher nicht versucht. Programmiererfahrung… hmm… definiere Programmiererfahrung :wink:. In HTML, CSS, PHP, JavaScript, C, COBOL beherrsche ich die Grundlagen (hatte ich letztes Jahr auf der EDV-Schule, in die ich gehe). Die Grundlagen aus VB.NET, Java und ABAP lerne ich seit diesem Jahr. Mit Netzwerkprogrammierung hatte ich bisher nichts am Hut. Ich habe lediglich Datenbankabfragen auf MySQL, Oracle und SQL-Server aus PHP, VB und Java gestellt und verarbeitet. Das wars dann auch schon.

Liebe Grüße
Woosh

Hallo,

Also wenn du das eine Bibliothek machen lassen willst, musst
du dich da nicht im Detail auskennen.

Das will ich für den Anfang auch nicht. Wenn ich das Programm
fertig habe, werde ich mir trotzdem mal die Bibliotheken
genauer ansehen und evtl. sogar selbst versuchen, etwas
Ähnliches nachzuprogrammieren.

Ich kann dir trotzdem mal ein Auszug aus einer HTTP-Verbindung
geben:

Request:

GET / HTTP/1.1
Host: sg

  • Leerzeile
    Mich würde jetzt zum Beispiel interessieren, wie soetwas in C
    aussehen würde. Hierfür kann man also libcurl nutzen?

Kann man. Das kümmert sich um den Aufbau der Verbindung, senden des richtigen Headers und empfangen der Daten.

Wie man das genau in C umsetzt weiss ich nicht, hab ich noch nie probiert, aber hier wird dir sicher geholfen:
http://curl.haxx.se/libcurl/

Eventuell mal das Paket runterladen und nach Beispielen suchen.

Das Parsen ist nicht einfach. Wie viel Programmiererfahrung
hast du denn?

Das Parsen habe ich bisher nicht versucht.

Dann solltest du dir erst mal Grammatiken wie EBNF anschauen: http://de.wikipedia.org/wiki/EBNF

Und dich dann mal in die Dokumentation von Bison einarbeiten: http://www.gnu.org/software/bison/

Programmiererfahrung… hmm… definiere Programmiererfahrung
:wink:. In HTML, CSS, PHP, JavaScript, C, COBOL beherrsche ich
die Grundlagen (hatte ich letztes Jahr auf der EDV-Schule, in
die ich gehe). Die Grundlagen aus VB.NET, Java und ABAP lerne
ich seit diesem Jahr. Mit Netzwerkprogrammierung hatte ich
bisher nichts am Hut. Ich habe lediglich Datenbankabfragen auf
MySQL, Oracle und SQL-Server aus PHP, VB und Java gestellt und
verarbeitet. Das wars dann auch schon.

Dann hast du dir ja was vorgenommen :wink:
Wobei die Voraussetzungen sicher schlechter hätten sein können.

Grüße,
Moritz

Hallo Moritz,

Kann man. Das kümmert sich um den Aufbau der Verbindung,
senden des richtigen Headers und empfangen der Daten.
http://curl.haxx.se/libcurl/
Dann solltest du dir erst mal Grammatiken wie EBNF anschauen:
http://de.wikipedia.org/wiki/EBNF
Und dich dann mal in die Dokumentation von Bison einarbeiten:
http://www.gnu.org/software/bison/

Okay, super :smile: werde mir das mal anschauen :smile:

Dann hast du dir ja was vorgenommen :wink:

Was meinst du?

Danke für deine Tipps :wink:

Liebe Grüße
Woosh

Nocheinmal Hallo :wink:

noch eine Frage zu libcurl: Kümmert sich die Bibliothek also sowohl um Verbindung zum Server, als auch um das Senden des Requests und das Empfangen des Response? Ich muss mich also nur noch um die Arbeit mit den HTML- und Header-Daten (die ich ja dann von libcurl bekomme) im C-Programm befassen?

Gruß
Woosh

Hallo Woosh,

Kann mir dabei jemand auf die Sprünge helfen? Irgendwelche
Libraries, Beispiele, Erläuterungen, vllt. sogar Tutorials?

Eine Frage dazu. Soll das unter Windows, unter Linux
oder unter ewtas ganz anderem programmiert werden und
laufen?

Grüße

CMb

Hallo CMb,

Eine Frage dazu. Soll das unter Windows, unter Linux
oder unter ewtas ganz anderem programmiert werden und
laufen?

Tut mir leid, das habe ich ganz vergessen. Primär will ich das für Windows XP machen. Klappt dort alles, eventuell noch unter Debian Etch. Aber vorerst geht es mir nur um Windows :wink:

Liebe Grüße
Woosh