SHARE
TWEET

Untitled

a guest May 19th, 2017 48 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  Angela Popovich
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netdb.h>
  10. #include <string.h>
  11.  
  12. #define SOCK_TYPE SOCK_DGRAM
  13.  
  14. #define MAXBUFLEN 1024
  15.  
  16. #define MSG_WELCOME "welcome"
  17. #define MSG_READY "ready"
  18. #define MSG_PLAY "play"
  19. #define MSG_ROUND "round"
  20. #define MSG_GAME "game"
  21. #define MSG_BUSY "busy"
  22.  
  23. #define MSG_JOIN "join"
  24. #define MSG_SHOW "show"
  25.  
  26. enum PlayerState{
  27.     START,
  28.     READY,
  29.     CHOOSE,
  30.     END,
  31.     ERROR
  32. };
  33.  
  34. struct Player{
  35.     char ID[20];
  36.     char choice[3];
  37. };
  38.  
  39. int main(int argc, char *argv[]){
  40.  
  41.     int sockfd, portno, server_addr_len;
  42.  
  43.     struct sockaddr_in server_addr, player_addr, serv_addr;
  44.     //struct in_addr serv_addr, player_addr;
  45.     int bytes_sent, bytes_received;
  46.  
  47.     // Make sure we have enough arguments
  48.     if(argc < 2){
  49.         perror("client: not enough arguments passed");
  50.         return -1;
  51.     }
  52.  
  53.  
  54.     // send and receive buffers
  55.     char buffer[MAXBUFLEN];
  56.     char msg[MAXBUFLEN];
  57.     char arg[MAXBUFLEN];
  58.  
  59.     // state of the player
  60.     enum PlayerState state;
  61.  
  62.     // set the socket
  63.     sockfd = socket(PF_INET, SOCK_TYPE,0);
  64.  
  65.     // if socket error occurs
  66.     if(sockfd < 0){
  67.         perror("client: error creating socket");
  68.         return -1;
  69.     }
  70.  
  71.     portno = atoi(argv[2]);
  72.  
  73.     serv_addr.sin_family = AF_INET;
  74.     serv_addr.sin_addr.s_addr = htonl(strtoul(argv[2]));
  75.     serv_addr.sin_port = htons(portno);
  76.  
  77.     player_addr.sin_family = AF_INET;
  78.     player_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  79.     player_addr.sin_port = htons(portno);
  80.  
  81.     if(connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0){
  82.         perror("Error connecting");
  83.         return -1;
  84.     }
  85.  
  86.     /* define player for me, could be made differently*/
  87.  
  88.     struct Player me, opponent;
  89.         char name[] = "apopovi";
  90.         strcpy(me.ID, name);
  91.  
  92.     // Set state to start
  93.     state = START;
  94.  
  95.     while((state != END) && (state != ERROR)){
  96.  
  97.         switch(state){
  98.  
  99.                 case START:
  100.                     sprintf(buffer, "%s %s", MSG_READY,me.ID);
  101.                     bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *) &player_addr, sizeof(player_addr));
  102.                     if(bytes_sent < 0){
  103.                         perror("client: [Join] error sending join message to server");
  104.                         state = ERROR;
  105.                         break;
  106.                     }
  107.                     else{
  108.                         state = READY;
  109.                         break;
  110.                     }
  111.  
  112.                 case READY:
  113.                     server_addr_len = sizeof(server_addr);
  114.                     bytes_received = recvfrom(sockfd, buffer, MAXBUFLEN-1, 0, (struct sockaddr *) &player_addr, &server_addr_len);
  115.                     if(bytes_received < 0){
  116.                         perror("client: [Ready] error receiving message from server");
  117.                         state = ERROR;
  118.                         break;
  119.                     }
  120.  
  121.                     buffer[bytes_received] = '\0';
  122.  
  123.                     printf("server: %s",buffer);// output message received
  124.  
  125.                     //extract message
  126.                     sscanf(buffer,"%s %s",msg,arg);
  127.  
  128.                     if(strcmp(msg,MSG_READY) == 0){
  129.                             strcpy(opponent.ID,arg);
  130.                             state = CHOOSE;
  131.                     }
  132.                     else if(strcmp(msg,MSG_GAME) == 0){
  133.                             state = END;
  134.                     }
  135.                     break;
  136.  
  137.             case CHOOSE:
  138.                 bytes_received = recvfrom(sockfd, buffer, MAXBUFLEN-1, 0, (struct sockaddr *) &player_addr, &server_addr_len);
  139.                     if(bytes_received < 0){
  140.                         perror("client: [Ready] error receiving message from server");
  141.                         state = ERROR;
  142.                         break;
  143.                     }
  144.  
  145.                 printf("server: %s",buffer);// output message received
  146.  
  147.                 //extract message
  148.                 sscanf(buffer,"%s %s",msg,opponent.ID);
  149.  
  150.                 if(strcmp(msg,MSG_PLAY) == 0){
  151.                     printf("Choose rock (r) paper (p) or scissors (s)\n");
  152.                     scanf("%c",me.choice);
  153.                     strcpy(buffer,MSG_SHOW);
  154.                     arg[0] = " ";
  155.                     arg[1] = me.choice;
  156.                     arg[2] = '\0';
  157.                     strcat(buffer,arg);
  158.  
  159.                     bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *) &player_addr, sizeof(player_addr));
  160.                     if(bytes_sent < 0){
  161.                         perror("client: [Play] error sending join message to server");
  162.                         state = ERROR;
  163.                         break;
  164.                     }
  165.  
  166.                     state = READY;
  167.                 }
  168.                 break;
  169.  
  170.             case ERROR:
  171.                 printf("Error occured, ending program\n");
  172.                 return -1;
  173.  
  174.             case END:
  175.                 printf("Game over\n");
  176.                 return -1;
  177.         }
  178.  
  179.         return 0;
  180. }
  181. }
RAW Paste Data
Top