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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [WinSock] Есть ли файл на хостинге? Как узнать лежит ли файл на хостинге? 
V
    Опции темы
MuForum
Дата 20.5.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток.
Пишу код на VC++ под ОС Windows.

# Задача: Есть путь к файлу "http://.../myzile.exe", необходимо узнать существует ли данный файл на хостинге.


# Вариант №1:
Код

#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;
}

- Не подходит, так как если файла на хостинге нет, то http-сервер возвращает сообщение, а функция HttpQueryInfo() возвращает длину этого сообщения, а не длину файла.


# Вариант №2:
Код

SOCKET conn        = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
...
int iRes    = WSAConnect(conn, (sockaddr*) & a, sizeof(sockaddr_in), NULL, NULL, NULL, NULL);
...
// GET %s HTTP/1.0
PrepareRequest(szRequest, iRequestLen, m_szHost);
iRes    = send(conn, szRequest, iRequestLen, 0);
...
iRes    = recv(conn, (PCHAR) & InBuf, 4096, 0);
....

- Происходит тоже самое что и в пункте №1, правда тут можно в ручную обработать ответ, и если обнаружится вхождение на "404 Not Found", то файла нет.
Код

bool ProcessingResponse_404NotFound(const PCHAR szBuf, const DWORD dwLen)
{
    bool result        = false;
    // ----
    for(DWORD i = 0; i < dwLen; i++)
    {
        if ( szBuf[i] != 0x0D ) continue;
        // ----
        char szBufTemp[128];
        ZeroMemory(szBufTemp, sizeof(szBufTemp));
        // ----
        memcpy(szBufTemp, szBuf, i);
        // ----
        if ( strstr(szBufTemp, "404") != NULL )
        {
            result    = true;
        }
        // ----
        break;
    }
    // ----
    return result;
}




P.S. -> Есть какой-то более красивый способ это выяснить, чем вариант № 2?


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

1. Список кодов состояния HTTP: Wiki - Ru;
2. List of HTTP status codes: Wiki - En;


Это сообщение отредактировал(а) MuForum - 20.5.2011, 17:53


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


 




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


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

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