Как я могу отправлять и получать файлы нескольких размеров в одном сокете C ++? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь разработать клиент-серверное приложение для обмена файлами ..

1 - Размер файла для отправки клиентом

2 - Клиент отправляет данные файла (имя + содержимое)

3 - Размер файла для сервера

4- Данные файла recv сервера (имя + содержимое)

У меня есть код, который хорошо работает для одного файла, и я спрашиваю, как его отредактировать, чтобы я мог отправлять и получать размер нескольких файлов?

Может кто-нибудь помочь плз !!!

Код клиента:

 cout << "[Client] Sending files name to the Server... " << endl ;
 int i=0;
 while(i<files_vector.size()){

                /************ Read & Send filename *************/


    string filename = files_vector[i].getFullNameFile();

    string test = filename+"&&";
    size_t nameLen = strlen(test.c_str());

     if(filename == "." || filename == "..")
        continue;

    string path_file = cf.pathSrcFiles+filename;

    std::ifstream infile(path_file, std::ifstream::binary);

    int32_t sizef = files_vector[i].getTaille();


        /*** Send file size to server ***/


        char fsize[256];
        sprintf(fsize, "%d", nameLen+sizef);

         if(send(sock, fsize, sizeof(fsize),0) < 0){
          perror("Error sending file size\n");

          exit(1);
        }
         /**** Send file data ****/

    char content_file[sizef];

    bzero(content_file, sizef);

    infile.read(content_file,sizef);

    string concat = test+string(content_file);
    char file[sizef];

    strcpy(file, concat.c_str());

        cout << "content : " << file << endl;
        cout << "size : " << nameLen+sizef << endl;

        if(send(sock, file, nameLen+sizef, 0) < 0)
        {
            cout << stderr << "ERROR: Failed to send file" << filename <<  " 
            (error no = " << errno << ")" << endl;
            break;
        }
        bzero(content_file, sizef);

        infile.close();

    cout << "Ok File " << filename << " from Client was Sent!\n" << endl;

  i++;
 }

Код сервера:

char csize[256];

int rc;

int32_t fsize;

/** Receive file size **/

if(rc = recv(sock, csize, 256, 0)) < 0){

    cout << "Error receiving file size" << endl;
    exit(1);
}

   csize[rc] = '\0';
   fsize = atoi(csize);

   int n = 0;
  int bytes_read = 0;

  char* file;
  file = new char[fsize];
  memset(file, 0, fsize);

  /** Receive file data **/

while((n = recv(sock, file+bytes_read, fsize-bytes_read, 0) > 0) && 
        (bytes_read < fsize)){


   cout << "content : " << file << endl;

   bytes_read += n;

    memset(file, 0, fsize);

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