this is a network programming code to run a rock paper scissors in a client and server.
I completed it and it was working without any error. After I added the findWinner function to the server code it starts giving me segmentation fault.
-the segmentation fault is fixed
Current problem -Also if I close server before the client I cannot connect to the server anymore.
Server part
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
void findWinner(int player,int pc)
{
const char *items[3]={"Paper","Scissors","Rock"};
printf("Client: %s\n",items[player-1]);
printf ("Computer: %s\n",items[pc-1]);
switch (player)
{
case 1:
switch (pc)
{
case 1:
printf("it is a DRAW\n");
break;
case 2:
printf("Computer Wins\n");
break;
case 3:
printf("Computer Loses\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
case 2:
switch (pc)
{
case 1:
printf("Computer Loses\n");
break;
case 2:
printf("it is a DRAW\n");
break;
case 3:
printf("Computer Wins\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
case 3:
switch (pc)
{
case 1:
printf("Computer Wins\n");
break;
case 2:
printf("Computer Loses\n");
break;
case 3:
printf("it is a draw\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
default:
printf("ERROR\n");
exit(0);
}
}
/// SERVER
int main(int argc, char *argv[])
{
//Declaring process variables.
int server_sockfd, client_sockfd;
int server_len ;
int rc,pcChoice ;
unsigned client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//Remove any old socket and create an unnamed socket for the server.
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htons(INADDR_ANY);
server_address.sin_port = htons(7735) ;
server_len = sizeof(server_address);
rc = bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
//Create a connection queue and wait for clients
rc = listen(server_sockfd, 5);
printf("waiting for client...\n") ;
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
printf("Client: ready\n") ;
printf("Go\n");
while(1)
{
int gameType;
printf("Paper, Scissors, Rock game start.\n");
rc = read(client_sockfd, &gameType, 1);
srand(time(NULL));
pcChoice = (rand() % 3)+1;
findWinner(gameType,pcChoice);
gameType = pcChoice;
write(client_sockfd, &gameType, 1);
}
printf("server exiting\n");
close(client_sockfd);
return 0;
}
Client
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
void showMenu()
{
printf("\tyou can choose\n");
printf("\t1 : Paper\n");
printf("\t2 : Scissors\n");
printf("\t3 : Rock\n");
printf("\t4 : Exit\n");
}
void showHelp()
{
printf("Paper beats rock (by covering it).\n");
printf("Rock beats scissors (by blunting it).\n");
printf("Scissors beats paper (by cutting it).\n");
printf("Matching choices draw.\n");
showMenu();
}
void findWinner(int player,int pc)
{
const char *items[3]={"Paper","Scissors","Rock"};
printf ("The Other Player Choose %s , ",items[pc-1]);
switch (player)
{
case 1:
switch (pc)
{
case 1:
printf("it is a DRAW\n");
break;
case 2:
printf("you LOST\n");
break;
case 3:
printf("you WON\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
case 2:
switch (pc)
{
case 1:
printf("you WON\n");
break;
case 2:
printf("it is a DRAW\n");
break;
case 3:
printf("you LOST\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
case 3:
switch (pc)
{
case 1:
printf("you LOST\n");
break;
case 2:
printf("you WON\n");
break;
case 3:
printf("it is a draw\n");
break;
default:
printf("ERROR\n");
exit(0);
};
break;
default:
printf("ERROR\n");
exit(0);
}
}
/// CLIENT
int main(int argc, char *argv[])
{
printf("Welcome to the Paper, Scissors and Rock game.\n");
showMenu();
int sockfd;
int len, rc ;
struct sockaddr_in address;
int result;
int itemType , tmp;
char num[1];
//Create socket for client.
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("Socket create failed.\n") ;
return -1 ;
}
//Name the socket as agreed with server.
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(7735);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1)
{
perror("Error has occurred");
exit(-1);
}
do
{
printf("\tEnter the option: ");
scanf("%1s",num);
fflush(stdin);
if (isdigit(num[0]))
{
itemType= num[0] - '0';
}
else
{
printf("Please Enter a number based on the options: \n");
showHelp();
continue;
}
if ((itemType <= 3) && (itemType > 0))
{
tmp=itemType;
rc = write(sockfd, &itemType, 1);
if (rc == -1) break ;
read(sockfd, &itemType, 1);
findWinner(tmp,itemType);
}
else if(itemType == 4)
{
printf("The game is terminated.\n");
exit(0);
}
else
{
showHelp();
continue;
}
}
while ( 1 );
close(sockfd);
exit(0);
}
Langara College / Hengameh Hamavand / Vancouver / Canada