Aufgabe 1 - snail

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 1 - snail
Kurze Frage zur Snail.
Wie soll der Benutzer die Mail senden können? Auch durch simple Eingabe von einem Punkt in der neuen Zeile (und dann newline natürlich)? oder kann/soll man es so implementieren, dass der Benutzer etwas anderes eingibt, bspw ein oder ->SEND ?


Bis EOF gelesen wurde.


Der Benutzer tippt seinen Nachrichtentext vollständig ein und drückt dann Ctrl-D, um den Standardeingabekanal zu schließen. Die [m]snail[/m] sendet daraufhin den Punkt an den Server und wickelt den verbleibenden Rest der Kommunikation ab.

Man soll [m]snail[/m] auch folgendermaßen benutzen können:

snail -s "Hey there" recipient@example.org < mailcontents.txt

(= “Reinpipen” des Nachrichtentextes aus einer Textdatei)


Wie fange ich EOF rechtzeitig ab? Meine Eingabe wird im I/O buffer gepuffert und erst nach einem Enter durchläuft meine Schleife :smiley:
Für jegliche Tipps wäre ich dankbar


Ich verstehe die Frage leider nicht ganz. Was genau ist das Problem, das du versuchst zu lösen?


Soweit ich von der Aufgabenstellung verstanden habe, müssen wir den Body der Mail einlesen bis einer EOF (STRG+D) in der Standardeingabe eingibt bzw. Ende einer Datei auftritt.
Ich habe es mit mehreren Funktionen versucht einzulesen bis EOF kommt. Aber ich bekomme das Problem, dass wenn ich EOF drücke, das Einlesen nciht sofort beendet wird, sondern erst nach dem 2. Mal EOF drücken. Bzw es wird rechtzeitig beendet ,wenn jemand Enter drückt.
Scheint so , als würde sich der Tastaturbuffer nur bei einem Enter leeren und erst dann wird meine Schleife durchlaufen.


Ah, jetzt versteh ich’s. :slight_smile:
Das ist normales Verhalten deines Terminals und kein Problem mit deinem Programm! Wenn man sich in der Mitte einer Zeile befindet, muss man Ctrl-D zweimal drücken, um [m]stdin[/m] zu schließen. Normalerweise erwartet das Terminal, dass man erst Enter drückt und dann Ctrl-D - dann macht es den Kanal auch sofort dicht.

1 Like

Hallo zusammen
Ich hätte auch mal eine Frage und zwar kommt bei mir, nachdem ich die MAIL FROM-Nachricht sende der Fehler “501 5.1.7 Bad sender address syntax” vom Server
Wenn ich mir aber die MAIL FROM-Nachricht ausgeben lasse, GENAU so kopiere und einfüge, wenn ich mit “nc” die Kommunikation simuliere dann scheint alles ok zu sein (“250 2.1.0 Ok”)
Ich wüsste nicht woran das liegen könnte, das ‘\r’ vor dem ‘\n’ habe ich auch nicht vergessen :confused:

Hier nochmal die Kommunikation meiner snail (mein username durch ‘blabla’ ersetzt):
220 faui03.informatik.uni-erlangen.de ESMTP Postfix
HELO faui06c.informatik.uni-erlangen.de
250 faui03.informatik.uni-erlangen.de
MAIL FROM: blabla@faui06c.informatik.uni-erlangen.de
501 5.1.7 Bad sender address syntax


Ich glaube, das ist ein Fall für die Rechnerübung.

Hier trotzdem ein paar Tipps von mir:
Wie sendest du denn die Anfragezeilen an den Server? Per [m]fprintf()[/m]? Oder baust du dir immer erst den String im Speicher zusammen und schickst ihn dann mit [m]write()[/m] [nicht empfehlenswert]? Kann es sein, dass du irgendwo versehentlich nicht-druckbare Zeichen wie z. B. [m]‘\0’[/m] mitschickst?
Meldet Valgrind irgendwelche Probleme?


Heißt das, dass subjects, die aus mehreren Worten bestehen per " " und nicht per < > getrennt werden sollen?


subjects? das ganze ist ein subject.

kleine hilfe (sollte aber schon bekannt sein!):

snail -s dies ist mein subject meine@email.de
   ^                                 ^
argv[0]            ...         argv[argc-1]
1 Like

Das ist mir schon klar :wink:
Ich meinte damit wie allgemein (deswegen plural bei subject) mit einem subject umgegangen werden soll, das aus mehreren Worten besteht.
Ich glaube ich bin hauptsächlich durch den exemplarischen Aufruf des Programms auf der Angabe:

verwirrt, weil ich dachte, dass ein subject immer in < > stehen müsste.

Zu [quote]
snail -s dies ist mein subject meine@email.de
^ ^
argv[0] … argv[argc-1]
[/quote]

hätte ich aber auch noch eine Frage :stuck_out_tongue:
Wenn ich jetzt z.B. wie bei

meine Nachricht aus einer Textdatei holen will, ist dann nicht mailcontents.txt an der Stelle argv[argc-1]?


Nein mit „< mailcontents.txt“ wird „mitgeteilt“, dass die Eingabequelle für stdin in diesem Fall eine Pipe/Datei ist und die Eingabe nicht per Terminal erfolgt - das hat nix mit den Sachen in argv zu tun.

Edit: Trotzdem eine Frage: Muss das, was nach -s steht, denn nun beliebig lang sein können?
Ich hab jetzt mal die Version von mir abgegeben, bei der man als Betreff eingeben kann, was man will :smiley:


Kann ich dann auch [m]./snail -s $‚Foo\r\n\r\nNachricht\r\n.\r\n‘[/m] eingeben? scnr


Ich hab auch ein Problem mit dem MAIL FROM-statement.
ich bau mir das mit strcat so zusammen, wie es auf dem Aufgabenblatt steht (also auch mit den spitzen Klammern) und
füge dann noch \r\n an. Also wenn ich mir noch ein ‘\0’ dazuklatsche und ausgeben lasse, sieht’s aus wie auf dem Aufgabenblatt.
Allerdings bekomme ich vom server die Meldung “502 5.5.2 Error: command not recognized”, wenn ich’s per fputs sende.
Ich habs auch mit fprintf probiert mit demselben ergebnis.
Hat jemand irgendeine Idee, was ich probieren könnte? Ich bin übrigens per ssh auf dem Uni-Rechner. Weiß nicht, ob es
was damit zu tun haben könnte.


Hast du [m]MAIL FROM:<[/m] geschrieben, oder [m]MAIL FROM: <[/m] (mit Leerzeichen)? Letzteres kann glaub ich Probleme machen.


Eingeben kann man es… :stuck_out_tongue:


Bei mir funktionierts mit oder ohne Lehrzeichen. Sende es mit fprintf allerdings nicht mit \0. (Benutze auch ssh).


Betreffs, die aus mehreren Wörtern bestehen, sollen als ein Argument an die [m]snail[/m] übergeben werden - deswegen das Setzen in Anführungszeichen beim Aufruf, denn so nimmt die Shell keine Zerhäckselung in mehrere Argumente vor.

Der Betreff ist immer entweder leer oder steht in [m]argv[2][/m].
Die Empfängeradresse steht immer entweder in [m]argv[1][/m] oder in [m]argv[3][/m].

1 Like