Segmentation Fault | Unix Linux Forums | Homework & Coursework Questions

  Go Back    


Homework & Coursework Questions Students must use and complete the template provided. If you don't, your post may be deleted! Special homework rules apply here.

Segmentation Fault

Homework & Coursework Questions


Tags
c programming, unix

Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 11-29-2012
femchi femchi is offline
Registered User
 
Join Date: Nov 2012
Last Activity: 11 December 2012, 5:48 PM EST
Posts: 12
Thanks: 6
Thanked 0 Times in 0 Posts
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

Code:
#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


Code:
#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

Last edited by femchi; 11-30-2012 at 03:39 AM..
Sponsored Links
    #2  
Old 11-30-2012
Praveen_218 Praveen_218 is offline
Registered User
 
Join Date: Feb 2008
Last Activity: 26 April 2014, 8:36 AM EDT
Location: Linux Machines @Mumbai & Bangalore
Posts: 165
Thanks: 7
Thanked 28 Times in 26 Posts
Your code Problems ...

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:


Code:
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?

Happy programming!!!!!!
The Following 3 Users Say Thank You to Praveen_218 For This Useful Post:
femchi (11-30-2012), jerzmacow (11-30-2012), vbe (11-30-2012)
Sponsored Links
    #3  
Old 11-30-2012
jerzmacow jerzmacow is offline
Registered User
 
Join Date: Nov 2012
Last Activity: 30 November 2012, 9:02 PM EST
Posts: 1
Thanks: 1
Thanked 0 Times in 0 Posts
That awkward moment when you're in the same class struggling with the same assignment..
"man comm"
    #4  
Old 11-30-2012
femchi femchi is offline
Registered User
 
Join Date: Nov 2012
Last Activity: 11 December 2012, 5:48 PM EST
Posts: 12
Thanks: 6
Thanked 0 Times in 0 Posts
Quote:
Originally Posted by jerzmacow View Post
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
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Using gdb, ignore beginning segmentation fault until reproduce environment segmentation fault pooyair Programming 6 10-13-2012 04:17 AM
Segmentation fault in C omega666 Programming 7 03-30-2011 04:06 PM
Why not a segmentation fault?? lagigliaivan Programming 22 05-21-2008 11:07 AM
Segmentation fault big123456 Linux 0 07-20-2007 05:01 AM
Segmentation Fault compbug UNIX for Dummies Questions & Answers 3 04-21-2006 10:43 AM



All times are GMT -4. The time now is 10:19 PM.