HELP! on client server programming

Hi, very new to programming. I was given a assignment for TCP socket, client server programming to come out with a Battleship game.

And I faced some issues on that I don't know how to read in user input and match it with the given coordinates in my txt file. I was told that I'm only needed to amended the server.cpp file. Please help...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <fstream>
#include <strings.h>
#include <stdlib.h>
#include <string>

using namespace std;

//function to handle the file and comparision
int clientside (int);

int main(int argc, char *argv[])
{

	
	int connfd, pid, portNo, listenfd;
	socklen_t len;
	bool loop = false;
	struct sockaddr_in servaddr, client_addr;

	//make sure the user setting up server enters in correct arguments
    	if (argc < 2)
    	{
        	cerr << "Syntax : ./server <port>" << endl;
        	return 0;
    	}

	portNo = atoi(argv[1]);	

	//only allows user setting up server to enter a certain range of port number
	if((portNo>65535) || (portNo<2000))
	{
		cerr<<"Please enter port number between 2000 - 65535"<<endl;
		return 0;
	}


    	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	//error msg if socket cannot be opened
	if (listenfd < 0)
	{
		cout<<"Cannot open socket!"<<endl;
		return 0;
	}

    	bzero((char *) &servaddr,sizeof(servaddr));

	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr.s_addr = INADDR_ANY;
    	servaddr.sin_port = htons(portNo);

	//error msg if hostname and ip address cannot be binded
    	if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0)
	{
		cout<<"Cannot bind!"<<endl;
		return 0;
	}     	listen(listenfd,5);

    	len = sizeof(client_addr);

	//endless while loop for server to keep listening for incoming connections
    	while (loop==false)
    	{
		cout<<"Listening....."<<endl;	

        	connfd = accept(listenfd,(struct sockaddr *)&client_addr,&len);

		//error msg if server cannot accept incoming connection		
		if (connfd < 0)
		{
			cout<<"Cannot accept connection!"<<endl;
			return 0;
		}	


		//everytime a connection is made, the parent fork out a copy
		//this allows multiple connections to the server
        	pid = fork();
        	if (pid < 0)
        	{
            		cerr << "ERROR forking!" << endl;;
            		return 0;
        	}
        	if (pid == 0)
        	{
			close(listenfd);
            		clientside(connfd);//reading client's attacked coordinate
			return 0;
       		}
        	else 
		{
			close(connfd);
		}
    	}
    	return 0;		
}

//function to handle the file and comparision
int clientside (int connfd)
{
	bool questFound = false;
    	char test[150];
	char warship[150];
	char shipgrid[150];
	char exitCheck[] = "exit";
	char temp[150];
	string fline;
	string::size_type pos;

    	bzero(test,151);
    	read(connfd,test,150);// client's attacked coordinate  stored in test

	//open the warship and shipgrid file
	ifstream infile;
	infile.open("position.txt");

	strcpy(temp,test);

	//case insensitive for 'exit'
	for(int i=0;i<strlen(temp);i++)
	{
		temp[i] = toupper(temp[i]);
	}

	//if client enters 'exit', server will be notified
	if(strcmp(temp,exitCheck)==0)
	{
		cout<<"Client has disconnected!"<<endl;
		cout<<"Listening....."<<endl;
	}
	else
	{
		//server displays msg from client - showing client attacked co-ordinate in variable test
		cout << "Message Received: " << test << endl;

		for(int i=0;i<strlen(test);i++)
		{
			test[i] = toupper(test[i]);
		}

	    	if (!infile)
	    	{
			cout << "Cannot open file" << endl;
			return 0;
	    	}
	    	else
	    	{
			//extracts data from file and compare
			while (getline(infile, fline) && questFound == false)
			{
		    		//cout<<fline<<endl;
					pos = fline.find(test, 0);

				      // to complete......
	
			}
			//if warship not found, display this
		 	if (questFound == false)
	   	 	{
	   		 	write(connfd,"Missed",999);
	   	
			}			
			//close file
			infile.close();
	  	}
	}
}


The position of my ships are:
aircraft carrier:A3;B3;C3;D3;E3
battleship:E1;F1;G1;H1
destroyer:F7;G7;H7
submarine:C2;D2;E2
patrol boat:D6;D7
Last edited on
Do you have any idea how that stuff works?

BTW, in function: int clientside (int connfd) there is the code:
1
2
3
		char test[150];
		//...
		bzero(test,151);

Do you know that what does?
Last edited on
i would suggest you to not work with fork() since it involves working with process and it takes a lot of memory try wroking with c++ theads <thread>.It has a lot of options that consumes less overhead.I think that will solve a lot of problems for u since u will get hold of the control urself
Topic archived. No new replies allowed.