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 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
|
#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);
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 question[150];
char answer[150];
char exitCheck[] = "exit";
char temp[150];
bzero(test,151);
read(connfd,test,150);
//open the question and answer file
ifstream infile;
infile.open("questions.txt");
strcpy(temp,test);
//case insensitive for 'exit'
for(int i=0;i<strlen(temp);i++)
{
temp[i] = tolower(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
cout << "Message Recieved: " << test << endl;
if (!infile)
{
cout << "Cannot open file" << endl;
return 0;
}
else
{
//extracts data from file and compare
while (!infile.getline(question,150,';').eof() && questFound == false)
{
infile.getline(answer,150);
//msg from client is case insensitive
for(int i=0;i<strlen(question);i++)
{
question[i] = tolower(question[i]);
}
for(int i=0;i<strlen(test);i++)
{
test[i] = tolower(test[i]);
}
//comparing input from client and data from file
if (strcmp(test,question)==0)
{
//if got match, write to client
questFound = true;
write(connfd,answer,50);
}
}
//if question not found, display this
if (questFound == false)
{
write(connfd,"Sorry I do not have the answer to your msg",999);
}
//close file
infile.close();
}
}
}
|