snail.c

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.

snail.c
Ich ueberlege gerade wie der ganze Text eingelesen werden soll, gets soll man laut man-Pages nicht verwenden, wenn ich fgets angebe muss ich eine groesse fuer den Buffer angeben, davon steht aber nichts in der Aufgabe. Hat jemand eine Idee oder einen heissen Tipp???


Nie, nie, nie [m]gets[/m] verwenden!

Zum Rest: Wie kann man denn Text (Hint: der aus einzelnen Zeichen besteht) von einem Deskriptor in einen anderen bringen? :wink:

1 „Gefällt mir“

Ja klar, Danke fuer den Hinweis, ich nehme stark an wir sollen write verwenden. Hmm und ansonsten ist die Mail ein File das aus einem Header mit drei Feldern die jeweils durch Zeilenumbruch voneinander getrennt sind und einem Body mit Text besteht, dazwichen eine leere Zeile, sehe ich das richtig?

Und zu guter letzt noch die Frage ob wir uns 1:1 an die Form der Mail, so wie sie auf dem Aufgabenblatt angegeben ist halten muessen, also

From: Max Mustermann be15piel@stud.informatik.uni-erlangen.de
To: hansdampf@example.org
Subject: Hallo Hans

Oder reicht es hier die Reihenfolge From, To, Subject, Body einzuhalten?


[m]write[/m] muss nicht unbedingt sein, du kannst auch mit etwas „higher-level“-Funktionen auf Zeichen arbeiten. Ansonsten ja, die Mail ist eine Folge von Zeichen in dem von dir genannten Format.

Willst du einen Client, der nur Mails an hansdampf@example.org schreiben kann? Das lässt sich relativ schlecht debuggen… In der Aufgabenstellung ist klar spezifiziert, was in den Header-Feldern stehen soll.


Nein ich meine nicht einen Client der nur an Hans Dampf schreiben kann, mir gings ums

“From:” Name
“To:”
“Subject:” Betreff

Ich wollte das File stattdessen so aufbauen:

Name Mailadresse(Absender)
Mailadresse(Empfaenger)
Betreff

EDIT: Ja fprintf erscheint mir jetzt gerade sehr nuetzlich, Danke nochmal…


Die ersten Zeilen müssen das Format inklusive dem "From: "/"To: "/"Subject: " einhalten, sonst ist es kein gültiger Mail-Header. Mit Dateien solltest du in dieser Aufgabe übrigens nichts tun müssen…

1 „Gefällt mir“

Muss ich nicht mit fputs oder etwas anderem in eins der Files schreiben welches fuer das Senden gedacht ist? Und mit etwas geeigneten aus dem File lesen das fuer den Empfang gedacht ist? So wie es auf Uebungsfolie Nummer 25 steht???

Und noch etwas, muessen wir eigentlich testen ob die Maildaresse valide ist also vom Typ @.*?

Plus, wird die Mail “als ganzes uebertragen” oder gestueckelt und wenn gestueckelt wie wird dann signalisiert das “man fertig ist”?


Doch du sollst schon etwas schreiben, aber nicht in eine Datei(File) sondern an den Server, die Funktionen, die du dafuer verwendest, sind aber die gleichen. Wenn die Mailadresse nicht passt, sagt dir der Server dass es die nicht gibt, wenn du die Statuscodes ueberpruefst sollte das also schon abgefangen werden. Das Ende der Mail wird durch den Punkt am Ende signalisiert.


Auf dem Uebungsblatt steht bei den Hinweisen “Bevorzugen Sie fur die Kommunikation die Bibliotheksfunktionen fprintf(3), fgets(3) bzw. getc(3), die mit FILE* arbeiten”, ich habe das bisher so verstanden das zwei Files erzeugt werden. Ein File in fuer eingehende Nachrichten aus dem dann mit fgets gelesen wird und ein anderes fuer das versenden, in das mit fprintf geschrieben wird. Es werden zwei Files erzeugt weil man so sicher geht das nicht gleichzeitig in ein File geschrieben wird (vom Server und vom Client gleichzeitig).

Falls write und read verwendet werden sollen, faende ich die Aufgabenstellung und Hinweise an der Stelle suboptimal, just my two cents…

EDIT: Unabhaengig was davon jetzt von uns in der Aufgabe verwendet werden soll habe ich gerade gelesen das die Bibliotheksfunktionen (fprintf, fscanf, fgets etc) intern Systemaufrufe (read, write) taetigen


Nur um das hier mal explizit zu sagen „FILE*“ ist ein File pointer, also ein Zeiger der auf etwas Dateiähnliches zeigt. Dies kann eine „echte“ Datei sein, muss aber nicht.
Es kann zum Beispiel auch so etwas wie ein socket(!) für Netzwerkkommunikation sein.

Du willst nicht read und write verwenden, wenn du die höherleveligen Alternativen hast.


Okay, Danke das war eine ganz klare Aussage :slight_smile: