Socketprogrammierung: Shell zerhackt



  • Hi!

    Hoffe ich bin richtig in diesem Forenteil. Habe gestern für die ersten Test einer Seminaraufgabe einfach mal einen HTTP-Client geschrieben. Ich will nicht das ihr mir die Hausaufgaben macht, keine Angst, dass krieg ich noch alleine hin. 😉
    Allerdings habe ich beim Empfangen des Dokuments bei sehr viel zu empfangenen Bytes anschließend starke Probleme mit der Shell. Wenn ich sie beispielsweise löschen will, dann bleibt alles stehen, was mir das Programm ausgegeben hat. Ich habe auch mal probiert alles in eine Datei zu schreiben und mit "cat" auszugeben. Leider trat dabei das gleiche Problem auf:

    vellas@~/projekte/cpp/c-seminar> li class="interwiki-fr"><a href="http://fr.wikipedia.org/wiki/">Français</a></li>
    <li class="interwiki-fy"><a href="http://fy.wikipedia.org/wiki/">Frysk</a></li>
    <li class="interwiki-gl"><a href="http://gl.wikipedia.org/wiki/">Galego</a></li>
    [...]

    So sieht es nach einem clear aus in der Shell.

    Das Skript was ich geschrieben habe ist hier zu finden, habe es noch an einigen stellen modifiziert, allerdings keine starken Änderungen, die hier erwähnenswert wären:
    http://www.uvomatik.de/programmierung/sockdoc/http-client.html

    Meine Empfangsroutine sieht jetzt so aus (allerdings funktioniert es auch nicht mit der ungeänderten Variante):

    while((bytes_recv = recv(sock, buf, sizeof(buf)-1, 0))>0) {
        buf[bytes_recv]=0;
        fputs(buf, stdout);
        memset(buf, 0, sizeof(buf));
    }
    

    Kompiliert habe ich mit: gcc -ansi -pedantic -Wall -Werror
    gcc Version: 3.4.4

    Hoffe das jemand eine Idee hat.
    Thx im voraus.

    Vellas



  • Anhand der verwendeten betriebssystemabhängigen Funktion (recv) und der Parameter für deinen Compiler entnehme ich, dass du unter Linux programmierst, richtig?

    Wie ist buf definiert?



  • solange du nur text ausgibst, dürfte da nichts schief gehen, habe jedenfalls keinen fehler gesehen. Ausser dass du \r\n statt \n im Request schicken solltest.

    Wenn du ne Binärdatei ausgibst, kann die Shell schonmal durcheinander kommen.



  • Sieht mir nach Unicode-Zeichen auf ner ASCII-Shell aus 😉 Das sind vermutlich die Binärzeichen die das verursachen.



  • AJ schrieb:

    Anhand der verwendeten betriebssystemabhängigen Funktion (recv) und der Parameter für deinen Compiler entnehme ich, dass du unter Linux programmierst, richtig?

    Wie ist buf definiert?

    buf ist bei mir so definiert:

    #define MAX_LINE 1024
    char buf[MAX_LINE];
    

    Ich programmiere in FreeBSD 6.0 RELEASE. Durch sizeof(buf)-1 stell ich sicher das nur 1023 Zeichen aufgenommen werden, damit auf jedenfall noch Platz für die Endekennung ist. Ansonsten hatte ich es teilweise das die Variable command noch ausgegeben wurde, nachdem Daten empfangen wurden.

    @DrGreenthumb:
    Sorry, dass habe ich vergessen zu erwähnen, ich habe \n durch \r\n ersetzt bei meiner GET-Anfrage.
    War keine Binärdatei dabei, zumindest nicht dass es mir bewusst wäre.

    Ich habe als Systemzeichensatz ISO-8859-15 eingestellt. Vllt. sollte ich wirklich mal auf Unicode umsteigen. 🙂 Ich werde es einfach mal ausprobieren und mich dann nochmal melden. Danke soweit an alle die geantwortet haben. 🙂

    Edit:
    Ich habe das mal eben ohne X getestet. Wenn X nicht gestartet ist, hat die Shell keine Probleme damit. Nur wenn X gestartet ist zerhaut es die Shell (in xterm).

    Gruß, Vellas



  • Kann es mit dem charset der jeweiligen Seite zu tun haben? Wie kann ich denn dafür sorgen das sowohl ISO-8859-15, als auch UTF-8 funktionieren? (Wenn einer angegeben ist und zwar iso-8859-1 oder -15, dann klappts, wenn keiner angegeben ist nicht und wenn utf-8 angegeben ist natürlich auch nicht). Habe mich noch nie so richtig mit verschiedenen Zeichensätzen beschäftigt. Link würde mir reichen.



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nunja Du musst machen was jeder Browser machen muss, den Seitenzeichensatz bei Bedarf in den Systemzeichensatz konvertieren. IMHO hat XHTML standardmäßig UTF-8, alles andere muss im Header oder im Kopf der HTML angegeben werden.

    Zum Konvertieren gibt es zumindest bei Linux iconv (http://www.uni-hildesheim.de/rz/DOC/php_de/ref.iconv.html)



  • Ok, danke für die Antwort. 🙂



  • ich dachte umlaute usw. schreibt man in html immer als &uml.. etc



  • Noch etwas: Mit

    cat -v [i]dateiname[/i]
    

    werden Binärzeichen vor der Ausgabe in unbedenklichen Text konvertiert, daher ist das aus Sicherheitsgründen immer, außer vielleicht wenn ein Dateiinhalt sehr genau bekannt ist, zu empfehlen, statt cat, welches die Binärzeichen ungefiltert (siehe LordJaxoms Post) ausgibt.



  • DrGreenthumb schrieb:

    ich dachte umlaute usw. schreibt man in html immer als &uml.. etc

    ne, zumindest bei XHTML kannst du jede beliebige Kodierung benutzen.


Anmelden zum Antworten