Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Angela Popovich
- */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <string.h>
- #define SOCK_TYPE SOCK_DGRAM
- #define MAXBUFLEN 1024
- #define MSG_WELCOME "welcome"
- #define MSG_READY "ready"
- #define MSG_PLAY "play"
- #define MSG_ROUND "round"
- #define MSG_GAME "game"
- #define MSG_BUSY "busy"
- #define MSG_JOIN "join"
- #define MSG_SHOW "show"
- enum PlayerState{
- START,
- READY,
- CHOOSE,
- END,
- ERROR
- };
- struct Player{
- char ID[20];
- char choice[3];
- };
- int main(int argc, char *argv[]){
- int sockfd, portno, server_addr_len;
- struct sockaddr_in server_addr, player_addr, serv_addr;
- //struct in_addr serv_addr, player_addr;
- int bytes_sent, bytes_received;
- // Make sure we have enough arguments
- if(argc < 2){
- perror("client: not enough arguments passed");
- return -1;
- }
- // send and receive buffers
- char buffer[MAXBUFLEN];
- char msg[MAXBUFLEN];
- char arg[MAXBUFLEN];
- // state of the player
- enum PlayerState state;
- // set the socket
- sockfd = socket(PF_INET, SOCK_TYPE,0);
- // if socket error occurs
- if(sockfd < 0){
- perror("client: error creating socket");
- return -1;
- }
- portno = atoi(argv[2]);
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl(strtoul(argv[2]));
- serv_addr.sin_port = htons(portno);
- player_addr.sin_family = AF_INET;
- player_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- player_addr.sin_port = htons(portno);
- if(connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0){
- perror("Error connecting");
- return -1;
- }
- /* define player for me, could be made differently*/
- struct Player me, opponent;
- char name[] = "apopovi";
- strcpy(me.ID, name);
- // Set state to start
- state = START;
- while((state != END) && (state != ERROR)){
- switch(state){
- case START:
- sprintf(buffer, "%s %s", MSG_READY,me.ID);
- bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *) &player_addr, sizeof(player_addr));
- if(bytes_sent < 0){
- perror("client: [Join] error sending join message to server");
- state = ERROR;
- break;
- }
- else{
- state = READY;
- break;
- }
- case READY:
- server_addr_len = sizeof(server_addr);
- bytes_received = recvfrom(sockfd, buffer, MAXBUFLEN-1, 0, (struct sockaddr *) &player_addr, &server_addr_len);
- if(bytes_received < 0){
- perror("client: [Ready] error receiving message from server");
- state = ERROR;
- break;
- }
- buffer[bytes_received] = '\0';
- printf("server: %s",buffer);// output message received
- //extract message
- sscanf(buffer,"%s %s",msg,arg);
- if(strcmp(msg,MSG_READY) == 0){
- strcpy(opponent.ID,arg);
- state = CHOOSE;
- }
- else if(strcmp(msg,MSG_GAME) == 0){
- state = END;
- }
- break;
- case CHOOSE:
- bytes_received = recvfrom(sockfd, buffer, MAXBUFLEN-1, 0, (struct sockaddr *) &player_addr, &server_addr_len);
- if(bytes_received < 0){
- perror("client: [Ready] error receiving message from server");
- state = ERROR;
- break;
- }
- printf("server: %s",buffer);// output message received
- //extract message
- sscanf(buffer,"%s %s",msg,opponent.ID);
- if(strcmp(msg,MSG_PLAY) == 0){
- printf("Choose rock (r) paper (p) or scissors (s)\n");
- scanf("%c",me.choice);
- strcpy(buffer,MSG_SHOW);
- arg[0] = " ";
- arg[1] = me.choice;
- arg[2] = '\0';
- strcat(buffer,arg);
- bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *) &player_addr, sizeof(player_addr));
- if(bytes_sent < 0){
- perror("client: [Play] error sending join message to server");
- state = ERROR;
- break;
- }
- state = READY;
- }
- break;
- case ERROR:
- printf("Error occured, ending program\n");
- return -1;
- case END:
- printf("Game over\n");
- return -1;
- }
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement