Сокет TCP / IP в C передаваемых файлах и с использованием шифра Цезаря - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над проектом, в котором мне нужно передать файлы через сокет TCP, в то же время я должен зашифровать текст файла с помощью Caesar Cypher, но у меня возникает ошибка, как вы можете видеть на изображении выше , ошибка - "присвоение выражению с типом массива", но у меня есть несколько предупреждений, которые, как мне кажется, связаны с моей ошибкой. Вы можете помочь мне решить эту проблему?

У меня int main завершен и работает, потому что я могу отправить файл без проблем, но я не мог поместить сюда весь код, потому что я давал ошибку при создании вопроса, поэтому int main как изображение

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024

 void send_file(FILE *fp, int sockfd){
      int n;

      char data[BUF_SIZE] = {0};

      while(fgets(data, BUF_SIZE, fp) != NULL) {
        if (send(sockfd, data, sizeof(data), 0) == -1) {
          perror("Error in sending file.");
          exit(1);
        }
        bzero(data, BUF_SIZE);
      }
    }
    void CaeserCypher(FILE *fp2, int key){
    int i =0;
    int cypherValue;
    char cypher[BUF_SIZE]={0};

    while(fgets(cypher, BUF_SIZE, fp2) != NULL){
        cypherValue =((int)cypher[i]- 97 + key)%26 + 97;
        cypher = cypherValue;

        fprintf("%c", cypher);
        i++;
    }
    bzero(cypher, BUF_SIZE);
}


int main(){
  char *ip = "127.0.0.1";
  int port = 9000;
  int e;

  int sockfd;
  struct sockaddr_in server_addr;
  FILE *fp, *fp2;
  char *filename = "exemplo.txt";
  int key=1;

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if(sockfd < 0) {
    perror("Error in socket");
    exit(1);
  }
  printf("Server socket created successfully.\n");

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = port;
  server_addr.sin_addr.s_addr = inet_addr(ip);

  e = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  if(e == -1) {
    perror("Error in socket");
    exit(1);
  }
    printf("Connected to Server.\n");


  fp2 = fopen(filename, "w");
  if (fp == NULL) {
    perror("Error in reading file.");
    exit(1);
  }
  void CaeserCypher(fp2, key);
  fclose(fp2);

  fp = fopen(filename, "r");
  send_file(fp, sockfd);
  printf("File data sent successfully.\n");

    printf("Closing the connection.\n");
  close(sockfd);

  return 0;
}

int main ошибка в коде `

1 Ответ

0 голосов
/ 26 мая 2020

Когда вы объявили cypher, вы объявили его как массив символов размером 1024. Это отличается от простого символа. Вы не можете просто присвоить значение (например, cypherValue) массиву. Вам нужно назначить его члену этого массива с помощью индекса. Вы можете сделать это с помощью чего-то вроде "cypher [index] = cypherValue;".

Кроме того, функция fgets считывает массив символов из файла и помещает их в переданный ей буфер (cypher). Ваш код в его текущем состоянии будет зашифровать только один символ в этом массиве перед (попыткой) записать его обратно в файл.

Я говорю, что попытка записать его обратно в файл, заключается в том, что ваш вызов с fprintf работать не будет. В отличие от printf, вам нужно передать FILE * в качестве первого аргумента перед передачей строки формата. Поскольку cyppher - это массив символов, а не просто один символ, вам нужно использовать "% s" в качестве строки формата.

Подробнее о функции fprintf можно узнать здесь: https://www.tutorialspoint.com/c_standard_library/c_function_fprintf.htm

Также есть несколько ошибок с вашей основной функцией. В строке 65 вы открываете fp2 в режиме записи, используя "w". Это приведет к удалению содержимого файла и не позволит вам прочитать файл для шифрования. Вот ссылка на функцию fopen: https://www.tutorialspoint.com/c_standard_library/c_function_fopen.htm

Наконец, в строке 66 fp должно быть fp2.

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