Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [WinSock-TCP] Скачать определённую часть архива, Как узнать размер файла на HTTP хостинге 
V
    Опции темы
MuForum
Дата 16.5.2011, 18:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброго времени суток.

# Задача: Необходимо разобраться по заголовкам .zip архив на хостинге и скачать определённый сжатый файл используя WinSock.
- С разбором .zip файла я закончил.
- С декодированием данных при помощи алгоритма Deflate разобрался.


# Как узнать размер файла на удалённом хостинге по пути:
Код

#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")
...
DWORD GetFileSizeByURL(PCHAR szURLFilePath)
{
    DWORD result        = 0;
    // ----
    HINTERNET hSession    = InternetOpen("My Temp Browser", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    // ----
    if ( hSession == NULL ) return result;
    // ----
    HINTERNET hUrl    = InternetOpenUrl(hSession, szURLFilePath, "", 0, 0, 0);
    // ----
    if ( hUrl == NULL )
    {
        InternetCloseHandle(hSession);
        return result;
    }
    // ----
    DWORD dwFileSize    = 0;
    DWORD cb            = sizeof(DWORD);
    DWORD index            = 0;
    // ----
    int iRes    = HttpQueryInfo(hUrl, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_CONTENT_LENGTH, & dwFileSize, & cb, & index);
    if ( iRes == 0 )
    {
        DWORD dwError    = GetLastError();
    }
    else
    {
        result        = dwFileSize;
    }
    // ----
    InternetCloseHandle(hUrl);
    InternetCloseHandle(hSession);
    // ----
    return result;
}



# Как скачать определённую часть архива/файла:
Цитата

1. Как скачать определённую часть архива/файла?
- То есть, файл допустим 100 байт, мне нужно скачать 37 байтов, но начиная с 61 позиции.
- Предыдущее содержимое качать не нужно.

Вот стандартный вариант загрузки всего файла.
sprintf(buff,"GET %s\r\n\r\n",filepath);
send(conn,buff,strlen(buff),0);
while( (iLen = recv(conn, buff, 512, 0)) > 0 ) { }

P.S. -> А как можно указать, что мне необходимо начать скачивание со смещением?
- Для файлов аналоги: fseek(), SetFilePointer().



P.S. -> Надеюсь на какие-то подсказки, советы, пенки, ссылки и т.д.


# Добавлено:
Цитата

Воспользовался услугами Reget Deluxe и снифером =)
- На закачку файла из архива выбрал файл: http://zlib.net/zlib125.zip

Код

GET /zlib125.zip HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; <a href=http://www.reget.com>ReGet Deluxe 5.1</a>; Windows NT 5.1)
Accept: */*
Range: bytes=351178-
Referer: http://zlib.net/
Host: zlib.net




Вот что отправляет ReGet Deluxe на хост, чтобы скачать файл со смещением.

Если я правильно понял, тогда нужно отправлять следующий запрос:
Код

sprintf(buf, "Get %s\r\nRange: bytes=%d-\r\n\r\n", URLFilePath, dwSeek);
send(conn, buf, strlen(buf), 0);
while( (iLen = recv(conn, InBuf, iLen, 0)) > 0 ) { }



Это сообщение отредактировал(а) MuForum - 16.5.2011, 20:08


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0362 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.