Я пытаюсь построить модель сервер-клиент, где клиент отправит некоторую команду, и сервер выполнит эту команду, и результаты будут показаны. Необходимо выполнить сервер для обработки нескольких клиентских запросов.
НоЧто происходит, сервер отлично запускается и прослушивает нужный порт. Когда клиентская программа запускается впервые, сервер прекрасно прослушивает все команды из нее. Но теперь предположим, что я нажимаю Ctrl + C и заставляю клиентскую программу завершать работу иперезапустите его, теперь сервер не прослушивает ни одной команды от клиента. Я не могу понять, почему.
Код сервера:
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fstream>
#include <iostream>
#include <thread>
using namespace std;
#define BUFF_SIZE 1024
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define NO_USER -9999
char *SERVER_IP[2];
int SERVER_PORT[2];
static int global_uid=NO_USER;
void login(string,string);
int verifyCredentials(string,string);
void addUser(string,string);
void logout();
int groupExistence(int group_id);
void createGroup(int group_id);
void createGroup(int group_id)
{
/* if(!groupExistence(group_id) && global_uid!=NO_USER)
{
string filename1=to_string(group_id)+"_users.txt";
string filename2=to_string(group_id)+"_pending_users.txt";
ofstream file1,file2;
file1.open(filename1);
file1<<global_uid<<"\n";
file1.close();
file2.open(filename2);
file2.close();
}
else cout<<group_id<<": Group already Exists!"<<endl; */
cout<<"User active is : "<<global_uid<<endl;
}
int groupExistence(int group_id)
{
ifstream infile("All_Groups.txt");
int gid;
while(infile>>gid)
{
if(gid==group_id)
{ infile.close();
return 1;
}
}
infile.close();
return 0;
}
void logout()
{
if(global_uid!=NO_USER)
{
cout<<global_uid<<" logged out!."<<endl;
global_uid=NO_USER;
}
}
void login(string user_id,string password)
{
if(verifyCredentials(user_id,password))
{
global_uid=atoi(user_id.c_str());
cout<<"User : "<<global_uid<<" logged in."<<endl;
}
else cout<<"Login failed.Try again!"<<endl;
}
int verifyCredentials(string user_id,string password)
{
ifstream infile("user_info.txt");
string a,b;
while(infile>>a>>b)
{
if(user_id.compare(a)==0 && password.compare(b)==0) return 1;
}
infile.close();
return 0;
}
void addUser(string user_id,string password)
{
ofstream oft;
oft.open ("user_info.txt",ios::app); // Append mode
oft<< user_id<<" "<<password<<"\n"; // Writing data to file
oft.close(); // Closing the file
}
void startServer(char *Server_IP,int Server_Port)
{
int server_fd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(Server_Port);
addr.sin_addr.s_addr=inet_addr(Server_IP);
int addrlen=sizeof(addr);
bind(server_fd,(struct sockaddr *)&addr,sizeof(addr));
listen(server_fd,20);
int sockfd=accept(server_fd,(struct sockaddr *)&addr,(socklen_t *)&addrlen);
}
char ** commandParser(char input[1024])
{
char *token;
char **tokens=(char **)malloc(sizeof(char *)*10);
int index=1;
token=strtok(input," ");
//printf("IP : ");
tokens[0]=token;
while(token!=NULL)
{
token=strtok(NULL," ");
if(token!=NULL)
{
tokens[index++]=token;
}
}
return tokens;
}
void commandHandler(char input[1024])
{
int length=strlen(input);
char **command_tokens;
command_tokens=commandParser(input);
//printf("\n Command is : %s\n",command_tokens[0]);
if(strcmp(command_tokens[0],"create_user")==0)
{
addUser(command_tokens[1],command_tokens[2]);
cout<<command_tokens[1]<<": USER created!."<<endl;
}
if(strcmp(command_tokens[0],"login")==0)
{
login(command_tokens[1],command_tokens[2]);
}
if(strcmp(command_tokens[0],"logout")==0)
{
logout();
}
if(strcmp(command_tokens[0],"create_group")==0)
{
int new_gid=stoi(command_tokens[1]);
createGroup(new_gid);
}
}
void handleClient(int sockfd,char buffer[1024])
{
int val_read;
val_read=read(sockfd,buffer,1024);
if(val_read){ printf("Command read from Client is : %s \n",buffer);
commandHandler(buffer);
}
bzero(buffer,1024);
}
int main(int argc,char *argv[])
{
//printf("%s\n",argv[1]);
char *file_name=argv[1];
FILE *fp;
char *line=NULL;
size_t len=0;
ssize_t read1;
int tracker_id=atoi(argv[2]);
char buffer[1024]={0};
fp=fopen(file_name,"r");
if(fp==NULL)
exit(EXIT_FAILURE);
char *token;
int index=0;
while ((read1 = getline(&line, &len, fp)) != -1) {
//printf("Retrieved line of length %zu:\n", read);
token=strtok(line," ");
//printf("IP : ");
SERVER_IP[index]=token;
while(token!=NULL)
{
//printf("%s\n",token);
token=strtok(NULL," ");
if(token!=NULL)
{ //printf("PORT : ");
SERVER_PORT[index++]=atoi(token);
}
}
// printf("%s\n", line);
}
for(int i=0;i<2;i++)
{
printf("Server Ip : %s\n",SERVER_IP[i]);
printf("Server Port : %d \n",SERVER_PORT[i]);
}
if(tracker_id==1) //Here the server starts..
{
//start tracker 1.
int server_fd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(SERVER_PORT[0]);
addr.sin_addr.s_addr=inet_addr(SERVER_IP[0]);
int addrlen=sizeof(addr);
bind(server_fd,(struct sockaddr *)&addr,sizeof(addr));
//listen(server_fd,20);
size_t buf_sz=50;
int sockfd;
listen(server_fd,20);
printf("\nTracker 1 listening at %s:%d\n",SERVER_IP[0],SERVER_PORT[0]);
sockfd=accept(server_fd,(struct sockaddr *)&addr,(socklen_t *)&addrlen);
while(1)
{
thread th1(handleClient,sockfd,buffer);
th1.join();
buffer[0]={'\0'};
} //keep listening forever.
close(sockfd);
} //end of if tracker_id==1
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
return 0;
}
Код клиента:
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <cstring>
#include <iostream>
#include <fstream>
#define PORT 8081
using namespace std;
int main(int argc,char *argv[])
{ int sock=0,valread;
string user_input;
struct sockaddr_in serv_addr;
char *hello="create_user 2412 abcd1234";
char buffer[1024]={0};
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("\n Socket creating error\n");
return -1;
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{
printf("\nConnection Failed \n");
return -1;
}
char * writable;
while(1)
{
getline(cin,user_input);
writable = new char[user_input.size() + 1];
std::copy(user_input.begin(), user_input.end(), writable);
writable[user_input.size()] = '\0';
//hello=user_input.c_str();
write(sock,writable,strlen(writable));
//printf("Hello Message sent\n");
//valread=read(sock,buffer,1024);
//printf("%s\n",buffer);
}
delete [] writable;
close(sock);
return 0;
}
После перезапуска клиента серверная программа не отвечает.
Пожалуйста, помогите.