Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include "header.h"
- #include <signal.h>
- #include <sys/msg.h>
- #include <sys/ipc.h>
- #include <errno.h>
- int server_queue = -1;
- int clients_pids_qID[CLIENTS_NUMBER][2]; // [client_number][0] <= pid
- int clients_counter = 0;
- int can_quit = 0;
- int send_message(Message m, int client_number) {
- int status = msgsnd(clients_pids_qID[client_number][1], &m, SIZE_OF_MESSAGE_STRUCTURE, 0);
- if (status == -1)
- printf("Do klienta: %d nie udalo wyslac sie wiadomosci.\n", clients_pids_qID[client_number][0]);
- else
- printf("Wyslano wiadomosc do klienta: %d\n", clients_pids_qID[client_number][0]);
- return status;
- }
- int get_client_number(int c_pid){
- int i = 0;
- for (i = 0; i <CLIENTS_NUMBER; i++)
- if(clients_pids_qID[i][0] = c_pid)
- return i;
- return -1;
- }
- char * upper_case(char * s){
- int i;
- printf("%s", s);
- for (i = 0; s[i] != '\0'; i++)
- if(s[i] >= 'a' && s[i] <= 'z')
- s[i] += 'A' - 'a';
- printf("%s", s);
- return s;
- }
- char * get_time(){
- time_t rt;
- struct tm * c_time;
- time (&rt);
- c_time = localtime(&rt);
- return asctime(c_time);
- }
- void sigint_handler(int sig_num){
- printf(" Otrzymalem SIGINT i zamykam serwer.\n");
- int i;
- for(i=0; i<CLIENTS_NUMBER; i++)
- if(clients_pids_qID[i][0] != -1)
- kill(clients_pids_qID[i][0], SIGINT);
- exit(0);
- }
- void server_closing(){
- if(server_queue != -1)
- if( msgctl(server_queue, IPC_RMID, NULL) == -1)
- printf("Wystapil problem z zamykaniem kolejki.\n");
- else
- printf("Kolejka zamknieta poprawnie. Serwer zakonczyl prace.\n");
- else
- printf("Serwer zakonczyl prace. Kolejka nie istanila.\n");
- }
- void init_client(Message message){
- if( clients_counter < CLIENTS_NUMBER - 1) {
- key_t client_key = atoi(message.mes);
- clients_pids_qID[clients_counter][0] = message.pid;
- if ((clients_pids_qID[clients_counter][1] = msgget(client_key, 0)) == -1) {
- printf("Nie udalo otorzyc sie kolejki klienta: %d z powodu: %s!\n", message.pid, strerror(errno));
- return;
- } else
- printf("Udalo otorzyc sie kolejke klienta %d\n", message.pid);
- clients_counter++;
- }
- else {
- printf("Osiagnieto maksymalna liczbe klientow!");
- kill(message.pid, SIGINT);
- }
- }
- int main(int argc, char** argv) {
- atexit(server_closing);
- signal(SIGINT, sigint_handler);
- int i,j;
- for(i=0; i<CLIENTS_NUMBER; i++)
- for(j=0; j<2; j++)
- clients_pids_qID[i][j] = -1;
- if ((server_queue = msgget(ftok(getenv("HOME"), 's'), IPC_CREAT | 0600)) == -1) {
- printf("Nie udalo utprzyc sie koljeki dla serwera!\n");
- exit(1);
- } else
- printf("Stworzono kolejke dla serwera %d\n",server_queue);
- struct msqid_ds q_state;
- while(1){
- if(can_quit == 1){
- if(msgctl(server_queue, IPC_STAT, &q_state) == -1)
- printf("Problem z pobieraniem statusu kolejki!\n");
- if(q_state.msg_qnum == 0)
- break;
- }
- Message m;
- int c_number = -1;
- printf("Odbieram.\n");
- if (msgrcv(server_queue, &m, SIZE_OF_MESSAGE_STRUCTURE, 0, 0) != -1) {
- switch (m.mtype) {
- case INIT_CLIENT:
- init_client(m);
- break;
- case ECHO:
- c_number = get_client_number(m.pid);
- if(c_number != -1){
- send_message(m,c_number);
- } else {
- printf("Nie ma klienta o numerze %d \n",m.pid);
- }
- break;
- case UP:
- c_number = get_client_number(m.pid);
- if(c_number != -1){
- upper_case(m.mes);
- send_message(m,c_number);
- } else {
- printf("Nie ma klienta o numerze %d \n",m.pid);
- }
- break;
- case TIME:
- c_number = get_client_number(m.pid);
- if(c_number != -1){
- strcpy(m.mes, get_time());
- send_message(m,c_number);
- } else {
- printf("Nie ma klienta o numerze %d \n",m.pid);
- }
- break;
- case END:
- printf("Wylaczanie serwera.\n");
- can_quit = 1;
- break;
- default:
- printf("Nie ma takiego typu wiadomosci.\n");
- break;
- }
- }
- else {
- //printf("Wystapil problem z otrzymywaniem wiadomosci.\n");
- continue;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement