скачать файл через SSL в C - PullRequest
2 голосов
/ 24 мая 2011

Мне нужно написать SSL-клиент на C, который подключается к серверу и получает либо html, либо файл.Мне удалось получить HTML, но я не могу скачать бинарный файл.Например, я пытаюсь загрузить файл размером 3,8 МБ с https://www.openssl.org/source/openssl-1.0.0d.tar.gz, и мой код загружает только 1,1 МБ, и я даже не знаю, получил ли я в нем правильные данные.

Вот функция, которую я сделал для нее:

char *sslReadfile (connection *c)
{
  const int readSize = 1024;
  char *rc = NULL;
  int received, count = 0;
  char buffer[1024];
  char filename[40];
  printf("Input the file name to be saved:\n");
  scanf("%s",filename);
  FILE *fp;
  fp = fopen(filename, "wb");

  if (c)
    {
      while (1)
        {
          if (!rc)
            rc = malloc (readSize * sizeof (char) + 1);
          else
            rc = realloc (rc, readSize * sizeof (char) + 1);

          received = SSL_read (c->sslHandle, buffer, readSize);
          buffer[received] = '\0';

          if (received > 0)
            fprintf(fp,"%s",buffer);//strcat (rc, buffer);

          if (received < readSize)
            break;
          //count++;
        }
    }
  printf("\nFile saved!! %s !!!\n\n",filename);
  fclose(fp);
  return rc;
}

о, и я так ее называю:

char command[50];
sprintf(command,"GET /%s\r\n\r\n",relativepath);
sslWrite (c, command);
response = sslReadfile (c);

где c - мое соединение.

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Вы прерываете цикл при получении SSL_shutdown() и / или SSL_get_error(). Кроме того, вам не следует NUL завершать работу буфера и использовать fprintf, но сохранять буфер как есть при использовании fwrite. Теперь вы вводите NUL в свои данные, которых там не было.

2 голосов
/ 24 мая 2011

Не используйте fprintf для записи двоичных данных.Используйте fwrite.Причина, по которой вы выводите меньше, состоит в том, что fprintf останавливается на первом нулевом символе, пропуская все символы, которые остаются в 1024-байтовом буфере.Кроме того, вы, похоже, не используете и не нуждаетесь в буфере malloc d rc.

Итак, после вызова SSL_read вам нужно что-то вроде этого:

if (received <= 0) break;
fwrite(buffer, 1, received, fp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...