Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.11 KB | None | 0 0
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include "header.h"
  7. #include <signal.h>
  8. #include <sys/msg.h>
  9. #include <sys/ipc.h>
  10. #include <errno.h>
  11.  
  12. int server_queue = -1;
  13. int clients_pids_qID[CLIENTS_NUMBER][2]; // [client_number][0] <= pid
  14. int clients_counter = 0;
  15. int can_quit = 0;
  16.  
  17. int send_message(Message m, int client_number) {
  18.     int status = msgsnd(clients_pids_qID[client_number][1], &m, SIZE_OF_MESSAGE_STRUCTURE, 0);
  19.     if (status == -1)
  20.         printf("Do klienta: %d nie udalo wyslac sie wiadomosci.\n", clients_pids_qID[client_number][0]);
  21.     else
  22.         printf("Wyslano wiadomosc do klienta: %d\n", clients_pids_qID[client_number][0]);
  23.     return status;
  24. }
  25.  
  26. int get_client_number(int c_pid){
  27.     int i = 0;
  28.     for (i = 0; i <CLIENTS_NUMBER; i++)
  29.         if(clients_pids_qID[i][0] = c_pid)
  30.             return i;
  31.     return -1;
  32. }
  33.  
  34. char * upper_case(char * s){
  35.     int i;
  36.     printf("%s", s);
  37.     for (i = 0; s[i] != '\0'; i++)
  38.         if(s[i] >= 'a' && s[i] <= 'z')
  39.             s[i] += 'A' - 'a';
  40.     printf("%s", s);
  41.     return s;
  42. }
  43.  
  44. char * get_time(){
  45.     time_t rt;
  46.     struct tm * c_time;
  47.     time (&rt);
  48.     c_time = localtime(&rt);
  49.     return asctime(c_time);
  50. }
  51.  
  52. void sigint_handler(int sig_num){
  53.     printf(" Otrzymalem SIGINT i zamykam serwer.\n");
  54.     int i;
  55.     for(i=0; i<CLIENTS_NUMBER; i++)
  56.         if(clients_pids_qID[i][0] != -1)
  57.             kill(clients_pids_qID[i][0], SIGINT);
  58.     exit(0);
  59. }
  60.  
  61. void server_closing(){
  62.     if(server_queue != -1)
  63.         if( msgctl(server_queue, IPC_RMID, NULL) == -1)
  64.             printf("Wystapil problem z zamykaniem kolejki.\n");
  65.         else
  66.             printf("Kolejka zamknieta poprawnie. Serwer zakonczyl prace.\n");
  67.     else
  68.         printf("Serwer zakonczyl prace. Kolejka nie istanila.\n");
  69. }
  70.  
  71. void init_client(Message message){
  72.     if( clients_counter < CLIENTS_NUMBER - 1) {
  73.         key_t client_key = atoi(message.mes);
  74.         clients_pids_qID[clients_counter][0] = message.pid;
  75.  
  76.         if ((clients_pids_qID[clients_counter][1] = msgget(client_key, 0)) == -1) {
  77.             printf("Nie udalo otorzyc sie kolejki klienta: %d z powodu: %s!\n", message.pid, strerror(errno));
  78.             return;
  79.         } else
  80.             printf("Udalo otorzyc sie kolejke klienta %d\n", message.pid);
  81.         clients_counter++;
  82.     }
  83.     else {
  84.         printf("Osiagnieto maksymalna liczbe klientow!");
  85.         kill(message.pid, SIGINT);
  86.     }
  87. }
  88.  
  89. int main(int argc, char** argv) {
  90.     atexit(server_closing);
  91.     signal(SIGINT, sigint_handler);
  92.  
  93.     int i,j;
  94.     for(i=0; i<CLIENTS_NUMBER; i++)
  95.         for(j=0; j<2; j++)
  96.             clients_pids_qID[i][j] = -1;
  97.  
  98.     if ((server_queue = msgget(ftok(getenv("HOME"), 's'), IPC_CREAT | 0600)) == -1) {
  99.         printf("Nie udalo utprzyc sie koljeki dla serwera!\n");
  100.         exit(1);
  101.     } else
  102.         printf("Stworzono kolejke dla serwera %d\n",server_queue);
  103.  
  104.     struct msqid_ds q_state;
  105.     while(1){
  106.         if(can_quit == 1){
  107.             if(msgctl(server_queue, IPC_STAT, &q_state) == -1)
  108.                 printf("Problem z pobieraniem statusu kolejki!\n");
  109.             if(q_state.msg_qnum == 0)
  110.                 break;
  111.         }
  112.         Message m;
  113.         int c_number = -1;
  114.         printf("Odbieram.\n");
  115.         if (msgrcv(server_queue, &m, SIZE_OF_MESSAGE_STRUCTURE, 0, 0) != -1) {
  116.             switch (m.mtype) {
  117.                 case INIT_CLIENT:
  118.                     init_client(m);
  119.                     break;
  120.  
  121.                 case ECHO:
  122.                     c_number = get_client_number(m.pid);
  123.                     if(c_number != -1){
  124.                         send_message(m,c_number);
  125.                     } else {
  126.                         printf("Nie ma klienta o numerze %d \n",m.pid);
  127.                     }
  128.                     break;
  129.  
  130.                 case UP:
  131.                     c_number = get_client_number(m.pid);
  132.                     if(c_number != -1){
  133.                         upper_case(m.mes);
  134.                         send_message(m,c_number);
  135.                     } else {
  136.                         printf("Nie ma klienta o numerze %d \n",m.pid);
  137.                     }
  138.                     break;
  139.  
  140.                 case TIME:
  141.                     c_number = get_client_number(m.pid);
  142.                     if(c_number != -1){
  143.                         strcpy(m.mes, get_time());
  144.                         send_message(m,c_number);
  145.                     } else {
  146.                         printf("Nie ma klienta o numerze %d \n",m.pid);
  147.                     }
  148.                     break;
  149.  
  150.                 case END:
  151.                     printf("Wylaczanie serwera.\n");
  152.                     can_quit = 1;
  153.                     break;
  154.  
  155.                 default:
  156.                     printf("Nie ma takiego typu wiadomosci.\n");
  157.                     break;
  158.             }
  159.         }
  160.         else {
  161.             //printf("Wystapil problem z otrzymywaniem wiadomosci.\n");
  162.             continue;
  163.         }
  164.     }
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement