Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #define MAX 300
- #define ROWS 10
- #define COLS 20
- #define ANSI_COLOR_YELLOW "\x1b[01;33m"
- #define ANSI_COLOR_RED "\x1b[1;31m"
- #define ANSI_COLOR_GREEN "\x1b[32m"
- #define ANSI_COLOR_RESET "\x1b[0m"
- int sockfd=0;
- char player[MAX];
- char game[ROWS][COLS];
- //FUNZIONI
- char *IP(char **argv){
- char *ip;
- struct hostent *hp;
- hp=gethostbyname(argv[1]);
- if(!hp) exit(1);
- return inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]);
- }
- /* Create the connection with server */
- void SocketTCP(char **argv){
- struct sockaddr_in Caddr;
- char buffer[MAX], *serverAddr;
- int ret=0;
- uint16_t PORT= strtoul(argv[2],NULL,10); //conversione porta
- serverAddr=IP(argv);
- Caddr.sin_family=AF_INET;
- Caddr.sin_port=htons(PORT);
- inet_aton(serverAddr,&Caddr.sin_addr);
- if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
- printf("[-]Error socket.\n");
- exit(1);
- }
- else printf("[+]ClientSocket created.\n");
- if((ret=connect(sockfd,(struct sockaddr*)&Caddr,sizeof(Caddr)))<0){
- printf("[-]Error connection.\n");
- exit(1);
- }
- else printf("[+]Connected to Server.\n");
- }
- /* Print the matrix game and information messages */
- void PrintMatrix(char mex[]){
- for(int i=0;i<ROWS;i++){
- for(int j=0;j<COLS;j++){
- if(game[i][j]=='o' || game[i][j]==' ') printf("[ ]");
- else{
- printf("[");
- if (game[i][j]=='X') printf(ANSI_COLOR_RED "%c" ANSI_COLOR_RESET,game[i][j]);
- else if(game[i][j]!='-' && game[i][j]!='+') printf(ANSI_COLOR_YELLOW "%c" ANSI_COLOR_RESET,game[i][j]);
- else if (game[i][j]=='-') printf(ANSI_COLOR_GREEN "%c" ANSI_COLOR_RESET,game[i][j]);
- else printf("%c",game[i][j]);
- printf("]");
- }
- if(j==COLS-1 && i==0 && mex!=NULL) printf(" %s", mex);
- }
- printf("\n");
- }
- }
- void Registration(){
- char buffer[MAX], buffer2[MAX];
- int nbytes=0, flag=0;
- do{
- flag=0;
- printf(">: [!]Insert username:\n>: ");
- fgets(buffer,MAX,stdin);
- printf(">: [!]Insert password:\n>: ");
- fgets(buffer2,MAX,stdin);
- for(int i=0;i<strlen(buffer);i++) if(buffer[i]==' ')flag=1;
- for(int i=0;i<strlen(buffer2);i++) if(buffer2[i]==' ')flag=1;
- if(strcmp(buffer,"\n")==0 || strcmp(buffer2,"\n")==0)flag=1;
- if(flag)printf(">: [!]Credentials not valid, retry.\n"); //non sono ammessi spazi e credenziali costituite da \n
- }while(flag); //restituisco username e password solo se non contengono spazi o '\n'
- write(sockfd,buffer,strlen(buffer)-1);
- write(sockfd,buffer2,strlen(buffer2)-1);
- nbytes=read(sockfd,buffer,MAX);
- if(nbytes==0){ //se non legge bytes allora il server è caduto
- printf("\n[+]Server aborted.\n");
- exit(1);
- }
- buffer[nbytes]='\0';
- printf(">: %s",buffer);
- }
- void Login(){
- char buffer[MAX], buffer2[MAX];
- int nbytes=0;
- printf(">: [!]Insert username:\n>: ");
- fgets(buffer,MAX,stdin);
- printf(">: [!]Insert password:\n>: ");
- fgets(buffer2,MAX,stdin);
- write(sockfd,buffer,strlen(buffer)-1);
- sleep(1);
- write(sockfd,buffer2,strlen(buffer2)-1);
- nbytes=read(sockfd,buffer,MAX);
- if(nbytes==0){ //se non legge bytes allora il server è caduto
- printf("\n[+]Server aborted.\n");
- exit(1);
- }
- buffer[nbytes]='\0';
- printf(">: %s",buffer);
- }
- void PrintMenu(){
- printf(ANSI_COLOR_YELLOW "\n\n\t\t\t* * *C L I E N T* * *\n\n" ANSI_COLOR_RESET);
- printf("TYPE:\n\n [1]Number of connected clients.\n [2]Number of disconnected clients.\n [3]Registration.\n");
- printf(" [4]Connected users.\n [5]Login.\n [6]Start Game.\n *To exit write [exit]*\n");
- }
- void MatrixMenu(char mex[]){
- system("clear");
- printf(ANSI_COLOR_RED "\n\t\t\t* * *G A M E* * *\n\n\n" ANSI_COLOR_RESET);
- printf(ANSI_COLOR_YELLOW "%s\n" ANSI_COLOR_RESET,player);
- printf("[" ANSI_COLOR_RED "X" ANSI_COLOR_RESET "]=destination ["ANSI_COLOR_GREEN "-" ANSI_COLOR_RESET "]=obstacle [+]=package\n\n");
- PrintMatrix(mex);
- }
- void Play(){
- char buffer[MAX], message[MAX], quit[MAX], mex[MAX];
- int nbytes=0;
- nbytes=read(sockfd,game,sizeof(game)); //puntatore a matrice
- nbytes=read(sockfd,message,MAX); //che giocatore si rappresenta nella matrice
- message[nbytes]='\0';
- strcpy(player,message);
- MatrixMenu(NULL);
- while(1){ //menu di gioco
- 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>: ");
- fgets(buffer,MAX,stdin);
- write(sockfd,buffer,strlen(buffer));
- if(strcmp(buffer,"exit\n")==0){
- printf("\n>: [+]Disconnected from game.\n");
- break;
- }
- else if((strcmp(buffer,"\n")==0) || (strcmp(buffer,"s\n")!=0&&strcmp(buffer,"o\n")!=0
- &&strcmp(buffer,"e\n")!=0&&strcmp(buffer,"n\n")!=0&&strcmp(buffer,"S\n")!=0
- &&strcmp(buffer,"O\n")!=0&&strcmp(buffer,"E\n")!=0&&strcmp(buffer,"N\n")!=0&&strcmp(buffer,"4\n")!=0))
- printf(">: [!]Command not valid, retry.\n");
- else{
- nbytes=read(sockfd,mex,MAX);
- if(nbytes==0){ //se non legge bytes allora il server è caduto
- printf("[+]Server aborted.\n");
- exit(1);
- }
- mex[nbytes]='\0';
- read(sockfd,game,sizeof(game));
- if(strcmp(mex,"ok")!=0)MatrixMenu(mex);
- else MatrixMenu(NULL);
- nbytes=read(sockfd,quit,MAX);
- quit[nbytes]='\0';
- if(strcmp(quit,"noendgame")!=0)break; //interrrompo nel momento in cui avviene la stampa del vincitore
- }
- }
- sleep(2);
- system("clear");
- if(strcmp(buffer,"exit\n")!=0)printf(ANSI_COLOR_YELLOW "\t\t* * *%s* * *" ANSI_COLOR_RESET ,quit); //stampo il vincitore
- }
- /* Interface for the user with functions for the comunication with server */
- void ClientMenu(){
- char buffer[MAX];
- int nbytes=0;
- sleep(1);
- system("clear");
- PrintMenu();
- while(1){
- printf("\n>: ");
- fgets(buffer,MAX,stdin);
- write(sockfd,buffer,strlen(buffer));
- if(strcmp(buffer, "exit\n")==0){
- printf("\n>: [+]Client disconnected.\n");
- break;
- }
- else if(strcmp(buffer,"3\n")==0){ //registrazione
- if(read(sockfd,buffer,MAX)&&strcmp(buffer,"OK")==0) Registration();
- else printf(">: %s",buffer);
- }
- else if(strcmp(buffer,"5\n")==0) Login();
- else if(strcmp(buffer,"6\n")==0){ //se ha inizio la sessione di gioco
- if(read(sockfd,buffer,MAX)&&strcmp(buffer,"OK")==0){
- Play();
- PrintMenu();
- }
- else if((strcmp(buffer,"NOK")==0))printf(">: [+]You have to login to game, retry.\n");
- }
- else{
- nbytes=read(sockfd,buffer,MAX);
- if(nbytes==0){ //se il server non invia dati, ha abortito
- printf("\n[+]Server aborted.\n");
- break;
- }
- buffer[nbytes]='\0';
- printf(">: %s", buffer);
- }
- }
- close(sockfd);
- }
- /* Check that number of argument inserted by user on command line is correct */
- int CheckNumberArguments(int argc){
- if(argc==3) return 1;
- else return 0;
- }
- /* When an user types Ctrl-C */
- void ClientAbort(){
- write(sockfd,"abort",8); //avviso il server che il client è caduto
- signal(SIGTERM,SIG_IGN); //CTRL-/, terminazione da tastiera
- signal(SIGQUIT,SIG_IGN); //CTRL-Y, quit da tastiera
- close(sockfd);
- exit(1);
- }
- /* Main process */
- int main(int argc, char **argv){
- signal(SIGINT,ClientAbort); //se un client termina in modo anomalo (CTRL-C)
- if(CheckNumberArguments(argc)){
- SocketTCP(argv);
- ClientMenu();
- }
- else printf("[!]Please enter the correct number of arguments.\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement