Сервер не может прослушивать клиента после перезапуска клиента - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь построить модель сервер-клиент, где клиент отправит некоторую команду, и сервер выполнит эту команду, и результаты будут показаны. Необходимо выполнить сервер для обработки нескольких клиентских запросов.

НоЧто происходит, сервер отлично запускается и прослушивает нужный порт. Когда клиентская программа запускается впервые, сервер прекрасно прослушивает все команды из нее. Но теперь предположим, что я нажимаю 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;
}

После перезапуска клиента серверная программа не отвечает.

Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...