Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Verwendung von Message Queues

  1. #1
    Registrierter Benutzer Avatar von Lupus84
    Registriert seit
    09.05.2007
    Ort
    Krefeld
    Beiträge
    5

    Verwendung von Message Queues

    Ich habe mal wieder eine Aufgabe gestellt bekommen und habe da einige Probleme! Erstmal die Aufgabe:
    Ein Büro will als Dienst die Vermittlung von Fahrgemeinschaften einrichten, bei dem sich sowohl Fahrer mit eigenem PKW als auch Mitfahrer registrieren lassen können. Die einzelnen Registrierungen werden in eine Warteliste eingetragen, aus der sie in der Reihenfolge ihre Eingangs abgearbeitet werden.

    Die Registrierung erfolgt mit dem Aufruf:

    eintrag{-f|-m} Vorname Name

    wobei -f für den Fahrer und -m für den Mitfahrer stehen.

    Ein Serverprogramm, das im Hintergrund laufen soll arbeitet die Registrierungen, die an eine Message Queue gesandt wurden, ab und gibt jeweils dann, wenn sich sowohl ein Fahrer, als auch ein Mitfahrer registriert haben den folgenden Text auf dem Bildschirm aus:

    Neue Fahrgemeinschaft
    Fahrer: Vorname Name Mitfahrer: Vorname Name

    Bei Aufruf des Programmes eintrag mit der Option -a soll der Abbruch des Serverprozesses erfolgen und die Message Queue, die für die Warteliste angelegt wurde, soll gelöscht werden.

    Schreiben sie die beiden C-Programme eintrag.c und server.c! Führen sie eine Fehlerabfrage für den Erfolg des Anlegens der Message Queue, für die korrekte Anzahl der Argumente und für den Erfolg der Sende - und Leseoperation durch!

    So viel erstmal zur Aufgabenstellung. Jetzt zu meinen beiden Programmen ... ich bekomme immer eine Fehlermeldung dass die Message Queue nicht angelegt werden konnte! Woran liegt es?


    Eintrag.c :

    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <string.h>

    int main(int argc, char* argv[])
    {
    int msgid, status;

    if (argc != 4 && argc != 2)
    {
    printf("Aufruf: eintrag {-f|-m} vorname nachname\n");
    printf(" oder: eintrag -a für Abbruch");
    return -1;
    }

    struct msgbuf {
    long id;
    int term;
    char vn[20];
    char nn[20];
    } msg_snd;

    msgid = msgget(75, 0);

    if (msgid < 0)
    {
    printf("Fehler beim Anlegen der Message Queue\n");
    return -1;
    }

    if ( (strcmp(argv[1],"-a") == 0) && argc == 2)
    {
    msg_snd.id = 1;
    msg_snd.term = 1;

    status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

    if (status < 0)
    {
    printf("Fehler beim Senden\n");
    return -1;
    }
    return 0;
    }

    if (argc == 4)
    {

    if ( strcmp(argv[1], "-f") == 0)
    {
    msg_snd.id = 1;
    msg_snd.term = 0;
    strncpy(msg_snd.vn, argv[2], 19);
    strncpy(msg_snd.nn, argv[3], 19);

    printf("Fahrer: %s %s\n",msg_snd.vn, msg_snd.nn);

    status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

    if (status < 0)
    {
    printf("Fehler beim Senden\n");
    return -1;
    }
    }

    if ( strcmp(argv[1], "-m") == 0)
    {
    msg_snd.id = 2;
    msg_snd.term = 0;
    strncpy(msg_snd.vn, argv[2], 19);
    strncpy(msg_snd.nn, argv[3], 19);

    printf("Mitfahrer: %s %s\n",msg_snd.vn, msg_snd.nn);

    status = msgsnd(msgid, &msg_snd, sizeof(msg_snd)-sizeof(long), 0);

    if (status < 0)
    {
    printf("Fehler beim Senden\n");
    return -1;
    }
    }
    }
    return 0;
    }


    Server.c

    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
    int msgid, status;

    struct msgbuf {
    long id;
    int term;
    char vn[20];
    char nn[20];
    } msg_rcvf, msg_rcvm;

    msgid = msgget(75, IPC_CREAT|0777);

    if (msgid < 0)
    {
    printf("Fehler beim Anlegen der Message Queue\n");
    return -1;
    }

    printf("Server gestartet\n");

    while(1)
    {

    status = msgrcv(msgid, &msg_rcvf, sizeof(msg_rcvf)-sizeof(long), 1, 0);

    if (status < 0)
    {
    printf("Fehler beim Empfangen\n");
    return -1;
    }

    if (msg_rcvf.term == 1)
    {
    printf("Server wurde beendet\n");
    msgctl(msgid, IPC_RMID, 0);
    return -1;
    }

    status = msgrcv(msgid, &msg_rcvm, sizeof(msg_rcvm)-sizeof(long), 2, 0);

    if (status < 0)
    {
    printf("Fehler beim Empfangen\n");
    return -1;
    }

    if (msg_rcvm.term == 1)
    {
    printf("Server wurde beendet\n");
    msgctl(msgid, IPC_RMID, 0);
    return -1;
    }

    printf("Fahrer: %s %s - Mitfahrer: %s %s\n",msg_rcvf.vn, msg_rcvf.nn, msg_rcvm.vn, msg_rcvm.nn);

    }

    return 0;
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    13.06.2007
    Beiträge
    20
    was sagt denn perror?

    vielleicht hilft Dir das weiter: http://users.actcom.co.il/~choo/lupg...sgqueue_create

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •