Mam zrobiony program ale cos nie dziala poprwanie moze ktos widzi bład. Programy sie kapiluja ale jak wybieram echo to nie dziala serwer czeka caly czas i kient to samo. przy czasie i koncu to samo sie dzieje.
Serwer przy uruchomieniu tworzy kolejki komunikatów, następnie
wykonuje kolejne zlecenia; przy zakończeniu pracy usuwa obie kolejki.
Klient po wykonaniu zadania (wysłanie i ewentualne odebranie odpowiedzi)
kończy działanie.
Klucze dla kolejek mają być generowane na podstawie ścieżki
$HOME.
Małe liczby do wygenerowania kluczy oraz rodzaje komunikatów mają być
zdefiniowane
we wspólnym pliku nagłówkowym.
Rodzaje zleceń
- Wysyłanie echa:
Klient wysyła ciąg znaków (pobrany z linii poleceń lub ze standardowego wejścia).
Serwer odsyła ten sam ciąg z powrotem.
Klient po odebraniu wysyła go na standardowe wyjście. - Wysłanie czasu:
Serwer wysyła do klienta datę i godzinę w postaci łańcucha znaków.
Klient po odebraniu informacji wysyła ją na standardowe wyjście. - Nakaz zakończenia:
Po odebraniu takiego zlecenia serwer zakończy działanie, jak tylko opróżni
się kolejka zleceń (zostaną wykonane wszystkie pozostałe zlecenia).
nagłowek
#include <string.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>
# define MAX 30
# define ECHO 1
# define CZAS 2
# define KONIEC 3
# define key1 1
# define key2 2
Klient
# include "h.h"
struct buf{
long mtype ;
char mtext[MAX] ;
int clientid ;
} wiadomosc ;
void client(int, int, char* ) ;
int main(int argc, char *argv[])
{
char ekran[MAX] ;
printf(argv[1]) ;
printf("\n") ;
int i = strlen(argv[1]) ;
printf("i = %d\n", i ) ;
int licz ;
for( licz = 0; licz <= i ; licz++)
ekran[licz] = argv[1][licz] ;
ekran[i+1] = '\0' ;
printf("ekran = %s\n", ekran) ;
printf("Z linii polecen pobralem napis %s\n", ekran) ;
int k1, k2 ;
char * adres = calloc(30, sizeof(char)) ;
adres = getenv("HOME") ;
k1 = ftok(adres , key1 ) ;
printf("k1 = %d\n", k1) ;
k2 = ftok(adres , key2 ) ;
printf("k2 = %d\n", k2) ;
int s_d_k , k_d_s;
if ((k_d_s= msgget(k1, 0666)) == -1)
perror("blad utworzenia kolejki klient do serwera\n") ;
if( (s_d_k = msgget(k2, 0666)) == -1)
perror("blad utworzenia kolejki serwer do klietna\n") ;
printf("k_d_s= %d\n s_d_k = %d\n",
k_d_s, s_d_k) ;
printf("\nOtwieram klienta\n") ;
client(k_d_s, s_d_k, ekran) ;
return 0;
}
void client(int klient_do_serwera, int s_d_k, char *ekran)
{
printf("Tu klient\n") ;
wiadomosc.mtype = ECHO ;
printf("wiadomosc.mtype = %ld\n", wiadomosc.mtype) ;
int pid = getpid() ;
wiadomosc.clientid = pid ;
printf("pid procesu = %d\n", pid) ;
printf("wiadomosc.clientid = %d\n", wiadomosc.clientid) ;
printf("ekran = %s\n", ekran) ;
int i = strlen(ekran) ;
int licz ;
for(licz = 0; licz <= i ; licz ++)
wiadomosc.mtext[licz] = ekran[licz] ;
wiadomosc.mtext[i+1] = '\0' ;
printf("wiadomosc.mtext = %s\n", wiadomosc.mtext) ;
printf("Wysylam komunikat\n") ;
if( msgsnd(klient_do_serwera, &wiadomosc, sizeof(wiadomosc), 0) < 0)
perror("Blad wysylania wiadomosci wysylanie echa\n") ;
printf("Wyslalem komunikat\n") ;
printf("Czekam na odpowiedz od serwera\n") ;
if( msgrcv(s_d_k, &wiadomosc, sizeof(wiadomosc), pid, 0) == -1)
perror("blad wiadomosci typu ECHO z serwera\n") ;
else{
printf("odebralem odpowiedz od serwera\n") ;
printf("wiadomosc.mtype = %ld\n", wiadomosc.mtype) ;
printf("wiadomosc.mtext = %s\n", wiadomosc.mtext) ;
printf("\n\nWyslanie na standardowe wyjscie:\n") ;
printf("###########################\n") ;
fputs(wiadomosc.mtext, stdout) ;
fputc('\n', stdout) ;
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@\n") ;
}
if( msgrcv(s_d_k, &wiadomosc, sizeof(wiadomosc), CZAS, 0) == -1)
perror("Blad odbierania od serwera czasu\n") ;
else{
printf("Odebralem czas!\n Wiadomosc.mtext = %s\n", wiadomosc.mtext) ;
printf("typ wiadomosci to czas %ld\n", wiadomosc.mtype) ;
printf("\n\nWysylam pobrany czas:\n") ;
printf("$$$$$$$$$$$$$$$$$$$$$$$$\n") ;
fputs(wiadomosc.mtext, stdout) ;
fputc('\n', stdout) ;
printf("****************************\n") ;
}
printf("Wysylam zlecenie 'KONIEC'!\n") ;
if(msgsnd(klient_do_serwera, &wiadomosc, sizeof(wiadomosc), 0) < 0)
perror("Blad wysylania wiadomosciu typu 3 - koniec\n") ;
}
serwer
# include "h.h"
struct buf{
long mtype ;
char mtext[MAX] ;
int clientid ;
} wiadomosc ;
void server(int, int ) ;
int main(int argc, char *argv[])
{
int k1, k2 ;
char *adres = calloc(30, sizeof(char)) ;
adres = getenv("HOME") ;
k1 = ftok(adres , key1 ) ;
printf("k1 = %d\n", k1) ;
k2 = ftok(adres , key2 ) ;
printf("k2 = %d\n", k2) ;
int k_d_s, s_d_k ;
if ((k_d_s = msgget(k1, 0666 | IPC_CREAT)) == -1)
perror("Nie mozna utworzyc kolejki klient do serwera\n") ;
if( (s_d_k = msgget(k2, 0666 | IPC_CREAT)) == -1)
perror("Nie mozna utworzyc kolejki serwer do klietna\n") ;
server(k_d_s, s_d_k) ;
msgctl(s_d_k, IPC_RMID, NULL) ;
msgctl(k_d_s, IPC_RMID, NULL) ;
return 0;
}
void server(int k_d_s, int s_d_k)
{
printf("Czekam na klienta\n") ;
if( msgrcv(k_d_s, &wiadomosc, sizeof(wiadomosc), ECHO, 0) < 0)
perror("Blad odbierania wiadomosci: wysylanie echa\n") ;
else{
printf("Odebralem dane:\n") ;
printf("identyfikator procesu klietna %d\n", wiadomosc.clientid) ;
printf("wiadomosc.mtype = %ld\n", wiadomosc.mtype) ;
printf("identyfikator procesu = %d\n", getpid()) ;
printf("wiadomosc.clientid = %d\n", wiadomosc.clientid) ;
printf("wiadomosc.mtext = %s\n", wiadomosc.mtext) ;
printf("Zmieniam typ komunikatu na pid klienta!\n") ;
wiadomosc.mtype = wiadomosc.clientid ;
printf("wiadomosc.mtype = %ld\n", wiadomosc.mtype) ;
printf("Wysylam odpowiedz do klienta\n") ;
if( msgsnd(s_d_k, &wiadomosc, sizeof(wiadomosc), 0) == -1)
perror("Blad wysylania odpowiedzi do klienta\n") ;
printf("Wyslalem odpowiedz\n") ;
}
wiadomosc.mtype = CZAS ;
printf("wiadomosc.mtye = %ld\n", wiadomosc.mtype) ;
time_t czas ;
time(&czas) ;
char * data ;
data = calloc(24, sizeof(char)) ;
strcpy(data, ctime(&czas)) ;
printf("czas = %s\n",data) ;
strcpy(wiadomosc.mtext, data) ;
printf("wiadomosc.mtext = %s\n", wiadomosc.mtext) ;
printf("Wysylam czas do klietna\n") ;
if( msgsnd(s_d_k, &wiadomosc, sizeof(wiadomosc), 0) == -1)
perror("Blad wysylania czasu do klienta\n") ;
else
printf("Wyslanie czasu\n") ;
printf("Odbieram od klienta zlecenie\n") ;
if( msgrcv(k_d_s, &wiadomosc, sizeof(wiadomosc), KONIEC, 0) == -1)
perror("Blad odbierania KONIEC od klienta\n") ;
else{
printf("Odebralem zlecenie = %ld\n", wiadomosc.mtype) ;
if( msgrcv(k_d_s, &wiadomosc, sizeof(wiadomosc), 0, IPC_NOWAIT) < 0 )
if( errno == ENOMSG)
{
printf("Koniec programu!\n") ;
msgctl(s_d_k, IPC_RMID, NULL) ;
msgctl(k_d_s, IPC_RMID, NULL) ;
exit(1) ;
}
}
}