77 lines
1.7 KiB
C
77 lines
1.7 KiB
C
/*
|
|
* 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
|
|
}
|
|
}
|