/* Klient oparty na kolejkach komunikatow dla serwera wspolbieznego. */ #include #include #include #include #include #include #include typedef struct mymesg1 { long mtype; pid_t pid; } paczka1; typedef struct mymesg2 { long mtype; double melement; } paczka2; int main(int argc, char *argv[]) { int f, f1; key_t klucz_kolejka; char *sciezka; int czy_czekac = 0, liczba_sekund; pid_t pid = getpid(); const size_t wielkosc1 = sizeof(paczka1) - sizeof(long); if (argc > 1) { czy_czekac = 1; liczba_sekund = strtol(argv[1], NULL, 10); } if (argc > 2) { sciezka = strndup(argv[2], strlen(argv[2])); } else { sciezka = strndup("/tmp/roboczy.kolejka_serwer", strlen("/tmp/roboczy.kolejka_serwer")); } if ((klucz_kolejka = ftok(sciezka, 1)) == -1) { perror("Klient: Blad funkcji ftok.\n"); free(sciezka); return -1; } else { if ((f = msgget(klucz_kolejka, 0600)) == -1) { perror("Klient: Blad funkcji msgget.\n"); return -1; } else { paczka1 *wiad = (paczka1 *)malloc(sizeof(paczka1)); ssize_t liczba_bajtow; wiad->mtype = 1; wiad->pid = pid; if (msgsnd(f, wiad, wielkosc1, 0) == -1) { perror("Klient: Blad funkcji msgsnd.\n"); free(wiad); return -1; } else { free(wiad); if ((klucz_kolejka = ftok(sciezka, pid)) == -1) { perror("Klient: Blad funkcji ftok.\n"); free(sciezka); return -1; } else { free(sciezka); if ((f1 = msgget(klucz_kolejka, 0600 | IPC_CREAT | IPC_EXCL)) == -1) { perror("Klient: Blad funkcji msgget.\n"); return -1; } else { paczka2 *praca; const size_t wielkosc2 = sizeof(paczka2) - sizeof(long); double a = 0; printf("Klient: Podaj liczbe: "); scanf("%lf", &a); praca = (paczka2 *)malloc(sizeof(paczka2)); praca->mtype = 2; praca->melement = a; if (czy_czekac) { printf("Klient: Oczekuje %d sekund na wyslanie wiadomosci do serwera.\n", liczba_sekund); sleep(liczba_sekund); } if (msgsnd(f1, praca, wielkosc2, 0) == -1) { free(praca); msgctl(f1, IPC_RMID, NULL); return -1; } else { if ((liczba_bajtow = msgrcv(f1, praca, wielkosc2, 3, 0)) == -1) { free(praca); msgctl(f1, IPC_RMID, NULL); return -1; } else { printf("Klient: Odebralem %ld bajtow od serwera.\n", liczba_bajtow); printf("Klient: Wynik: %lf^2 = %lf.\n", a, praca->melement); free(praca); msgctl(f1, IPC_RMID, NULL); return 0; } } } } } } } }