Übung 5
This commit is contained in:
10
Assets/Betriebssysteme_uebung/u5-a3-anlage/Makefile
Normal file
10
Assets/Betriebssysteme_uebung/u5-a3-anlage/Makefile
Normal file
@@ -0,0 +1,10 @@
|
||||
all: client server
|
||||
|
||||
client:
|
||||
gcc -o pipeclient pipeclient.c
|
||||
|
||||
server:
|
||||
gcc -o pipeserver pipeserver.c
|
||||
|
||||
clean:
|
||||
rm -f pipeclient pipeserver
|
||||
65
Assets/Betriebssysteme_uebung/u5-a3-anlage/pipeclient.c
Normal file
65
Assets/Betriebssysteme_uebung/u5-a3-anlage/pipeclient.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Named Pipes (FIFOs) - pipeclient.c
|
||||
*
|
||||
* Funktionsweise: Dieses Client-Programm meldet sich über ein benanntes Pipe
|
||||
* bei einem geeigneten Server und fragt mit einer Losung (Passwortsatz) nach
|
||||
* einem Geheimnis. Der Server kontrolliert die Losung. Ist diese korrekt,
|
||||
* antwortet der Server mit dem Geheimnis über die gleiche Pipe, welches auf
|
||||
* geeignete Weise vom Client gelesen werden kann.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
//char CODEWORD[] = "<Schluessel>";
|
||||
char CODEWORD[] = "<Schluessel>";
|
||||
char buffer[8];
|
||||
|
||||
int main() {
|
||||
// Öffnen der Named Pipe nur zum Schreiben
|
||||
printf("Client: Öffne Pipe nur zum Schreiben.\n");
|
||||
int id_p = open("P1", O_WRONLY); // const char *path, int oflag … / returnt einen Filedeskriptor
|
||||
|
||||
if (id_p >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Absenden des Codeworts an Server
|
||||
printf("Client: Übergebe Codewort an den Server.\n");
|
||||
int result_write = write(id_p, CODEWORD, strlen(CODEWORD));
|
||||
|
||||
if (result_write > 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
close(id_p);
|
||||
|
||||
// Empfangen der Antwort
|
||||
printf("Client: Empfange Geheimnis.\n\n");
|
||||
|
||||
// Öffnen der Pipe zum Lesen
|
||||
printf("Client: Öffne Pipe nur zum Lesen.\n");
|
||||
id_p = open("P1", O_RDONLY);
|
||||
|
||||
if (id_p >= 0) {
|
||||
printf(" OK.\n");
|
||||
}
|
||||
|
||||
// Lesen des Geheimnisses aus der Pipe
|
||||
int result_read = read(id_p, buffer, sizeof(buffer));
|
||||
|
||||
if (result_read > 0) {
|
||||
printf(" Geheimnis erhalten.\n\n");
|
||||
}
|
||||
|
||||
// Ausgabe des Geheimnisses
|
||||
printf("Client: Das Geheimnis lautet: '%s'.\n\n", buffer);
|
||||
|
||||
printf("Client: Ende.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
83
Assets/Betriebssysteme_uebung/u5-a3-anlage/pipeserver.c
Normal file
83
Assets/Betriebssysteme_uebung/u5-a3-anlage/pipeserver.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Named Pipes (FIFOs) - pipeserver.c
|
||||
*
|
||||
* Funktionsweise: Dieses Server-Programm erwartet von seinem Client über ein
|
||||
* von ihm angelegtes benanntes Pipe eine Losung (Passwortsatz). Nach
|
||||
* (erfolgreicher) Überpruefung verrät der Server ein Geheimnis. Anschließend
|
||||
* löscht er das Pipe wieder.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char buffer[30];
|
||||
|
||||
#define SECRET "xxx ..."
|
||||
|
||||
int main() {
|
||||
// Erzeugen der Named Pipe
|
||||
printf("Server: Erzeuge Named Pipe (FIFO).\n");
|
||||
int rw = mkfifo("P1", 0666); // erstellt PIPE bei const char *pathname hier P1, mit mode mode_t mode = 0_RDWR /erlaubt lesen und schreiben
|
||||
|
||||
if (rw >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Öffnen der Pipe zum Lesen
|
||||
printf("Server: Öffne Pipe zum Lesen.\n");
|
||||
int id_p = open("P1", O_RDONLY);
|
||||
|
||||
if (id_p >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Losung empfangen
|
||||
printf("Server: Warte auf Losung.\n");
|
||||
int result_read = read(id_p, buffer, sizeof(buffer));
|
||||
|
||||
if (result_read > 0) {
|
||||
printf(" Losung empfangen.\n\n");
|
||||
printf("Received: %s\n", buffer);
|
||||
}
|
||||
|
||||
// Vergleich
|
||||
if (strncmp(buffer, "<Schluessel>", strlen("<Schluessel>")) == 0) { // int strncmp(const char *str1, const char *str2, size_t n)
|
||||
printf("Server: Losung ist korrekt. Übergebe jetzt das Geheimnis.\n\n");
|
||||
|
||||
// Öffnen der Pipe zum Schreiben
|
||||
printf("Server: Öffne dazu Pipe nur zum Schreiben.\n");
|
||||
close(id_p);
|
||||
|
||||
id_p = open("P1", O_WRONLY);
|
||||
|
||||
if (id_p >= 0) {
|
||||
printf(" OK.\n");
|
||||
}
|
||||
|
||||
// Übergeben des Geheimnisses
|
||||
int result_write = write(id_p, SECRET, strlen(SECRET));
|
||||
|
||||
if (result_write > 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("Server: Das war falsch.\n");
|
||||
}
|
||||
|
||||
sleep(5);
|
||||
|
||||
// Vernichte Pipe
|
||||
unlink("P1");
|
||||
|
||||
printf("Server: Ende.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user