Übung 5
This commit is contained in:
10
Assets/Betriebssysteme_uebung/u5-a1-anlage/Makefile
Normal file
10
Assets/Betriebssysteme_uebung/u5-a1-anlage/Makefile
Normal file
@@ -0,0 +1,10 @@
|
||||
all: client server
|
||||
|
||||
client:
|
||||
gcc -o msgclient msgclient.c
|
||||
|
||||
server:
|
||||
gcc -o msgserver msgserver.c
|
||||
|
||||
clean:
|
||||
rm -f msgclient msgserver
|
||||
68
Assets/Betriebssysteme_uebung/u5-a1-anlage/msgclient.c
Normal file
68
Assets/Betriebssysteme_uebung/u5-a1-anlage/msgclient.c
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Message Queues - msgclient.c
|
||||
*
|
||||
* Funktionsweise: Der Client schickt eine Losung an einen Server. Falls die
|
||||
* Losung die vom Server erwartete war, gibt letzterer dem Client sein
|
||||
* Geheimnis preis.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MSGSIZE 100
|
||||
key_t key = 1337;
|
||||
int msgflg = 0666;
|
||||
|
||||
// Typdefinition für Message Queue (muss explizit geschehen, da noch nicht
|
||||
// vorhanden)
|
||||
struct message {
|
||||
long msgType;
|
||||
char msgText[MSGSIZE];
|
||||
};
|
||||
|
||||
// char CODEWORD[] = "<Losung>";
|
||||
char CODEWORD[] = "Losung";
|
||||
|
||||
int main() {
|
||||
struct message msg_snd;
|
||||
struct message msg_rcv;
|
||||
|
||||
// Verbinden mit Message-Queue des Servers
|
||||
printf("Client: Verbinde mich mit Message Queue.\n");
|
||||
int id_q = msgget(key, msgflg);
|
||||
|
||||
if (id_q >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Absenden des Codeworts
|
||||
printf("Client: Sende Codewort an den Server.\n");
|
||||
msg_snd.msgType = 5;
|
||||
strcpy(msg_snd.msgText, CODEWORD);
|
||||
|
||||
int result_snd = msgsnd(id_q, &msg_snd, MSGSIZE, 0);
|
||||
|
||||
if (result_snd >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Empfangen der Antwort
|
||||
printf("Client: Warte auf Geheimnis.\n");
|
||||
|
||||
// Abholen des Geheimnisses aus der Message-Queue
|
||||
int result_rcv = msgrcv(id_q, &msg_rcv, MSGSIZE, 6, 0);
|
||||
|
||||
if (result_rcv >= 0) {
|
||||
printf(" Geheimnis erhalten.\n\n");
|
||||
}
|
||||
|
||||
// Ausgabe des Geheimnisses
|
||||
printf("Client: Das Geheimnis lautet: '%s'.\n\n", msg_rcv.msgText);
|
||||
|
||||
printf("Client: Ende.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
76
Assets/Betriebssysteme_uebung/u5-a1-anlage/msgserver.c
Normal file
76
Assets/Betriebssysteme_uebung/u5-a1-anlage/msgserver.c
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Interprozesskommunikation über Message Queues - msgcserver.c
|
||||
*
|
||||
* Funktionsweise: Der Server erzeugt eine Message Queue und erwartet über diese
|
||||
* die Losung eines Client. Falls die Losung mit der vom Server erwarteten
|
||||
* übereinstimmt, teilt der Server dem Client sein Geheimnis mit.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MSGSIZE 100
|
||||
|
||||
#define SECRET "GGG ..."
|
||||
key_t key = 1337;
|
||||
int msgflg = IPC_CREAT | 0666; // Vergibt lese und schreibrechte an alle Nutzer, user group others
|
||||
struct message {
|
||||
long msgType;
|
||||
char msgText[MSGSIZE];
|
||||
};
|
||||
|
||||
int main() {
|
||||
struct message msg_rcv;
|
||||
struct message msg_snd;
|
||||
|
||||
// Erzeugen einer Message Queue
|
||||
printf("Server: Erzeuge Message Queue.\n");
|
||||
int id_q = msgget(key, msgflg);
|
||||
|
||||
if (id_q >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
|
||||
// Losung empfangen
|
||||
printf("Server: Warte auf Losung.\n");
|
||||
int result_rcv = msgrcv(id_q, &msg_rcv, MSGSIZE, 5, 0); // hier war
|
||||
|
||||
if (result_rcv >= 0) {
|
||||
printf(" Losung empfangen.\n\n");
|
||||
}
|
||||
|
||||
// Vergleich
|
||||
if (strncmp(msg_rcv.msgText, "Losung", strlen("Losung")) == 0) {
|
||||
printf("Server: Losung ist korrekt. Sende jetzt das Geheimnis.\n");
|
||||
|
||||
// Senden des Geheimnisses
|
||||
msg_snd.msgType = 5;
|
||||
strcpy(msg_snd.msgText, SECRET);
|
||||
|
||||
int result_snd = msgsnd(id_q, &msg_snd, MSGSIZE, 0);
|
||||
|
||||
if (result_snd >= 0) {
|
||||
printf(" OK.\n\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("Server: Das war falsch.\n");
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
|
||||
int result_ctl = msgctl(id_q, IPC_RMID, 0);
|
||||
|
||||
if (result_ctl >= 0) {
|
||||
printf("Server: Message Queue gelöscht. Ende.\n\n");
|
||||
return 0; // alles OK
|
||||
}
|
||||
else {
|
||||
printf("Server: Message Queue löschen fehlgeschlagen. Ende.\n\n");
|
||||
return 10; // Fehler
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user