Advertisement
Guest User

isac.c

a guest
Feb 26th, 2020
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <signal.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <netdb.h>
  12.  
  13. #define MAX 300
  14. #define ROWS 10
  15. #define COLS 20
  16. #define ANSI_COLOR_YELLOW "\x1b[01;33m"
  17. #define ANSI_COLOR_RED "\x1b[1;31m"
  18. #define ANSI_COLOR_GREEN "\x1b[32m"
  19. #define ANSI_COLOR_RESET "\x1b[0m"
  20.  
  21. int sockfd=0;
  22. char player[MAX];
  23. char game[ROWS][COLS];
  24.  
  25.  
  26. //FUNZIONI
  27.  
  28.  
  29. char *IP(char **argv){
  30.  
  31.     char *ip;
  32.     struct hostent *hp;
  33.  
  34.     hp=gethostbyname(argv[1]);
  35.     if(!hp) exit(1);
  36.  
  37.     return inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]);
  38. }
  39.  
  40. /* Create the connection with server */
  41. void SocketTCP(char **argv){
  42.  
  43.     struct sockaddr_in Caddr;
  44.     char buffer[MAX], *serverAddr;
  45.     int ret=0;
  46.  
  47.     uint16_t PORT= strtoul(argv[2],NULL,10); //conversione porta
  48.     serverAddr=IP(argv);
  49.  
  50.     Caddr.sin_family=AF_INET;
  51.     Caddr.sin_port=htons(PORT);
  52.     inet_aton(serverAddr,&Caddr.sin_addr);
  53.  
  54.     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
  55.         printf("[-]Error socket.\n");
  56.         exit(1);
  57.     }
  58.     else printf("[+]ClientSocket created.\n");
  59.  
  60.     if((ret=connect(sockfd,(struct sockaddr*)&Caddr,sizeof(Caddr)))<0){
  61.         printf("[-]Error connection.\n");
  62.         exit(1);
  63.     }
  64.     else printf("[+]Connected to Server.\n");
  65. }
  66.  
  67. /* Print the matrix game and information messages */
  68. void PrintMatrix(char mex[]){
  69.  
  70.     for(int i=0;i<ROWS;i++){
  71.  
  72.         for(int j=0;j<COLS;j++){
  73.  
  74.             if(game[i][j]=='o' || game[i][j]==' ') printf("[ ]");
  75.             else{
  76.                 printf("[");
  77.                 if (game[i][j]=='X') printf(ANSI_COLOR_RED "%c" ANSI_COLOR_RESET,game[i][j]);
  78.                 else if(game[i][j]!='-' && game[i][j]!='+') printf(ANSI_COLOR_YELLOW "%c" ANSI_COLOR_RESET,game[i][j]);
  79.                 else if (game[i][j]=='-') printf(ANSI_COLOR_GREEN "%c" ANSI_COLOR_RESET,game[i][j]);
  80.                 else printf("%c",game[i][j]);
  81.                 printf("]");
  82.             }
  83.             if(j==COLS-1 && i==0 && mex!=NULL) printf("   %s", mex);
  84.         }
  85.         printf("\n");
  86.     }
  87. }
  88.  
  89. void Registration(){
  90.  
  91.     char buffer[MAX], buffer2[MAX];
  92.     int nbytes=0, flag=0;
  93.  
  94.     do{
  95.         flag=0;
  96.         printf(">: [!]Insert username:\n>: ");
  97.         fgets(buffer,MAX,stdin);
  98.         printf(">: [!]Insert password:\n>: ");
  99.         fgets(buffer2,MAX,stdin);
  100.         for(int i=0;i<strlen(buffer);i++) if(buffer[i]==' ')flag=1;
  101.         for(int i=0;i<strlen(buffer2);i++) if(buffer2[i]==' ')flag=1;
  102.         if(strcmp(buffer,"\n")==0 || strcmp(buffer2,"\n")==0)flag=1;
  103.         if(flag)printf(">: [!]Credentials not valid, retry.\n"); //non sono ammessi spazi e credenziali costituite da \n
  104.  
  105.     }while(flag); //restituisco username e password solo se non contengono spazi o '\n'
  106.  
  107.     write(sockfd,buffer,strlen(buffer)-1);
  108.     write(sockfd,buffer2,strlen(buffer2)-1);
  109.  
  110.     nbytes=read(sockfd,buffer,MAX);
  111.     if(nbytes==0){ //se non legge bytes allora il server è caduto
  112.         printf("\n[+]Server aborted.\n");
  113.         exit(1);
  114.     }
  115.     buffer[nbytes]='\0';
  116.     printf(">: %s",buffer);
  117. }
  118.  
  119. void Login(){
  120.  
  121.     char buffer[MAX], buffer2[MAX];
  122.     int nbytes=0;
  123.  
  124.     printf(">: [!]Insert username:\n>: ");
  125.     fgets(buffer,MAX,stdin);
  126.     printf(">: [!]Insert password:\n>: ");
  127.     fgets(buffer2,MAX,stdin);
  128.  
  129.     write(sockfd,buffer,strlen(buffer)-1);
  130.     sleep(1);
  131.     write(sockfd,buffer2,strlen(buffer2)-1);
  132.  
  133.     nbytes=read(sockfd,buffer,MAX);
  134.     if(nbytes==0){ //se non legge bytes allora il server è caduto
  135.         printf("\n[+]Server aborted.\n");
  136.         exit(1);
  137.     }
  138.     buffer[nbytes]='\0';
  139.     printf(">: %s",buffer);
  140. }
  141.  
  142. void PrintMenu(){
  143.  
  144.     printf(ANSI_COLOR_YELLOW "\n\n\t\t\t* * *C  L  I  E  N  T* * *\n\n" ANSI_COLOR_RESET);
  145.     printf("TYPE:\n\n  [1]Number of connected clients.\n  [2]Number of disconnected clients.\n  [3]Registration.\n");
  146.     printf("  [4]Connected users.\n  [5]Login.\n  [6]Start Game.\n  *To exit write [exit]*\n");
  147. }
  148.  
  149. void MatrixMenu(char mex[]){
  150.  
  151.     system("clear");
  152.     printf(ANSI_COLOR_RED "\n\t\t\t* * *G A M E* * *\n\n\n" ANSI_COLOR_RESET);
  153.     printf(ANSI_COLOR_YELLOW "%s\n" ANSI_COLOR_RESET,player);
  154.     printf("[" ANSI_COLOR_RED "X" ANSI_COLOR_RESET "]=destination ["ANSI_COLOR_GREEN "-" ANSI_COLOR_RESET "]=obstacle [+]=package\n\n");
  155.     PrintMatrix(mex);
  156. }
  157.  
  158. void Play(){
  159.  
  160.     char buffer[MAX], message[MAX], quit[MAX], mex[MAX];
  161.     int nbytes=0;
  162.  
  163.     nbytes=read(sockfd,game,sizeof(game)); //puntatore a matrice
  164.     nbytes=read(sockfd,message,MAX); //che giocatore si rappresenta nella matrice
  165.  
  166.     message[nbytes]='\0';
  167.     strcpy(player,message);
  168.     MatrixMenu(NULL);
  169.  
  170.     while(1){ //menu di gioco
  171.  
  172.         printf("\nCOMMANDS:\n\n  [S]left\n  [N]down\n  [O]right\n  [E]up\n  [4]Connected Users\n  *To exit write [exit]*\n\n>: ");
  173.         fgets(buffer,MAX,stdin);
  174.         write(sockfd,buffer,strlen(buffer));
  175.  
  176.         if(strcmp(buffer,"exit\n")==0){
  177.             printf("\n>: [+]Disconnected from game.\n");
  178.             break;
  179.         }
  180.         else if((strcmp(buffer,"\n")==0) || (strcmp(buffer,"s\n")!=0&&strcmp(buffer,"o\n")!=0
  181.                 &&strcmp(buffer,"e\n")!=0&&strcmp(buffer,"n\n")!=0&&strcmp(buffer,"S\n")!=0
  182.                     &&strcmp(buffer,"O\n")!=0&&strcmp(buffer,"E\n")!=0&&strcmp(buffer,"N\n")!=0&&strcmp(buffer,"4\n")!=0))
  183.                         printf(">: [!]Command not valid, retry.\n");
  184.         else{
  185.             nbytes=read(sockfd,mex,MAX);
  186.             if(nbytes==0){ //se non legge bytes allora il server è caduto
  187.                 printf("[+]Server aborted.\n");
  188.                 exit(1);
  189.             }
  190.             mex[nbytes]='\0';
  191.             read(sockfd,game,sizeof(game));
  192.  
  193.             if(strcmp(mex,"ok")!=0)MatrixMenu(mex);
  194.             else MatrixMenu(NULL);
  195.  
  196.             nbytes=read(sockfd,quit,MAX);
  197.             quit[nbytes]='\0';
  198.             if(strcmp(quit,"noendgame")!=0)break; //interrrompo nel momento in cui avviene la stampa del vincitore
  199.         }
  200.     }
  201.     sleep(2);
  202.     system("clear");
  203.     if(strcmp(buffer,"exit\n")!=0)printf(ANSI_COLOR_YELLOW "\t\t* * *%s* * *"  ANSI_COLOR_RESET ,quit); //stampo il vincitore
  204. }
  205.  
  206. /* Interface for the user with functions for the comunication with server */
  207. void ClientMenu(){
  208.  
  209.     char buffer[MAX];
  210.     int nbytes=0;
  211.  
  212.     sleep(1);
  213.     system("clear");
  214.     PrintMenu();
  215.  
  216.     while(1){
  217.  
  218.         printf("\n>: ");
  219.         fgets(buffer,MAX,stdin);
  220.         write(sockfd,buffer,strlen(buffer));
  221.  
  222.         if(strcmp(buffer, "exit\n")==0){
  223.             printf("\n>: [+]Client disconnected.\n");
  224.             break;
  225.         }
  226.         else if(strcmp(buffer,"3\n")==0){ //registrazione
  227.  
  228.             if(read(sockfd,buffer,MAX)&&strcmp(buffer,"OK")==0) Registration();
  229.             else printf(">: %s",buffer);
  230.         }
  231.         else if(strcmp(buffer,"5\n")==0) Login();
  232.  
  233.         else if(strcmp(buffer,"6\n")==0){ //se ha inizio la sessione di gioco
  234.  
  235.             if(read(sockfd,buffer,MAX)&&strcmp(buffer,"OK")==0){
  236.                 Play();
  237.                 PrintMenu();
  238.             }
  239.             else if((strcmp(buffer,"NOK")==0))printf(">: [+]You have to login to game, retry.\n");
  240.         }
  241.         else{
  242.             nbytes=read(sockfd,buffer,MAX);
  243.             if(nbytes==0){ //se il server non invia dati, ha abortito
  244.                 printf("\n[+]Server aborted.\n");
  245.                 break;
  246.             }
  247.             buffer[nbytes]='\0';
  248.             printf(">: %s", buffer);
  249.         }
  250.     }
  251.     close(sockfd);
  252. }
  253.  
  254. /* Check that number of argument inserted by user on command line is correct */
  255. int CheckNumberArguments(int argc){
  256.  
  257.     if(argc==3) return 1;
  258.     else return 0;
  259. }
  260.  
  261. /* When an user types Ctrl-C */
  262. void ClientAbort(){
  263.  
  264.     write(sockfd,"abort",8); //avviso il server che il client è caduto
  265.  
  266.     signal(SIGTERM,SIG_IGN); //CTRL-/, terminazione da tastiera
  267.     signal(SIGQUIT,SIG_IGN); //CTRL-Y, quit da tastiera
  268.  
  269.     close(sockfd);
  270.     exit(1);
  271. }
  272.  
  273. /* Main process */
  274. int main(int argc, char **argv){
  275.  
  276.     signal(SIGINT,ClientAbort); //se un client termina in modo anomalo (CTRL-C)
  277.  
  278.     if(CheckNumberArguments(argc)){
  279.         SocketTCP(argv);
  280.         ClientMenu();
  281.     }
  282.     else printf("[!]Please enter the correct number of arguments.\n");
  283.  
  284.     return 0;
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement