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();
}
}
}
|