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) ;

              } 

  }
	                                

}