Segmentation Fault

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

Need to handle errors for values of the two variables 'player' and 'pc' for out of range values.

For eg. What if player == 0 and also pc == 0 .

Please dry run the below few lines from your own code and see what you get:


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]);


...

...

You are bound to get segmentation faults, isn't it? :rolleyes:

Happy programming!!!!!!

3 Likes

That awkward moment when you're in the same class struggling with the same assignment..
"man comm"

Then enjoy it. Aso there are some bugs and problems. If you fixed them let me find them out too