Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Реализация обновления программы - ClientSocket и ClientServer

Ответить
Настройки темы
C/C++ - [решено] Реализация обновления программы - ClientSocket и ClientServer

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: rar ClientSocket.rar
(14.9 Kb, 54 просмотров)
Привет. Заранее приношу извинение если буду использовать неверную терминологию, но до недавнего времени у меня небыло необходимости в использовании этих компонентов и самой технологии. Задача в общем-то такова, есть клиет-программа, на сервере есть обновления к этой программе, нужно по нажатию на кнопку\пункт меню "Обновить", чтобы программа скачала только те модули, которые новее тех, которые присутствуют рядом с программой. Аналог такого обновления, любой антивирус или AVZ. Поискал в сети, нашёл статью - Передача файлов в C++Builder через TClientSocket и TServerSocket. По примеру сделал тестовую программу, в рамках одного компьютера она работает, но там, в примере, есть клиентская часть и серверная.

Вот представьте, что наше обновление - этот файл - QuickKiller_2.20.7z нужно скачать и находится он здесь - http://tools.oszone.net/Drongo/QuickKiller_2.20.7z. Но скачивать нужно как обновление (как менеджер закачек), а не через диалоговое окно "Сохранить файл".

Архив простенького проекта прикрепил, собирал по примеру выше, при нажатии на кнопку "Скачать" устанавливает соединение и на этом всё. Собственно, я не знаю в какую сторону смотреть и те ли компоненты, которые я выбрал, нужны для этих целей? Среда разработки
Цитата:
Borland C++ Builder 6.0 Enterprise Suite
Спасибо.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 20:43, 14-04-2010

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, Ух, класс, здорово. Получилось. Задача макси решена.

А как теперь реализовать эту часть?
Цитата Drongo:
чтобы программа скачала только те модули, которые новее тех, которые присутствуют рядом с программой »
И как правильно сделать ход загрузки? По логике я должен узнать размер файла в байтах и задать это значение ProgressBar. Только, как я понял, CreateFile создаёт файл на диске и поэтому если так делать как я делаю, будет нулевой размер, а как правильн узнать размер скачиваемого файла, дату создания и имя?
Код: Выделить весь код
...
   if(data.bFlag) //осуществляется докачка
      InternetSetFilePointer(hInetFile, GetFileSize(hFile, NULL), NULL, FILE_BEGIN, 0); //сдвигаем чтение на GetFileSize бит

   // Ход загрузки
   Form1->ProgressBar1->Position = 0;
   Form1->ProgressBar1->Max = GetFileSize(hFile, NULL);

   //начинаем скачку
   do{
      Form1->ProgressBar1->StepIt(); // Добавил ход загрузки

      InternetReadFile(hInetFile, ReadBuf, sizeof(ReadBuf), &dwRead); //читаем в буффер
      if(dwRead >= 0){ //если считали
         ovlp.hEvent     = NULL;
	 ovlp.OffsetHigh = NULL;
	 ovlp.Offset     = GetFileSize(hFile, NULL);
         WriteFile(hFile, ReadBuf, dwRead, NULL, &ovlp); //пишем в наш файл
	 dwOffset += dwRead;
	}
      else{ //не считали, пытаемся повторить скачивание
...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 15:09, 16-04-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата Drongo:
А как теперь реализовать эту часть?
Цитата Drongo:
чтобы программа скачала только те модули, которые новее тех, которые присутствуют рядом с программой » »
Ну например:
1) проверить версию, которая лежит рядом с прогой.
2) Попытаться загрузить версию > из 1). Если ошибка, то новой версии нет иначе качаем новую.

Цитата Drongo:
а как правильн узнать размер скачиваемого файла »
Код: Выделить весь код
 // открываем запрос
    LPCWSTR rgszAcceptTypes[2] = {pstLRF_Params->szDocumentType,NULL};
    hRequest = ::HttpOpenRequest(hSessiont, L"GET", szUrlPath, L"HTTP/1.1", NULL,rgszAcceptTypes,
                                 INTERNET_FLAG_KEEP_CONNECTION,1);
         if (hRequest == NULL)  throw L"HttpOpenRequest Error";
                
 // посылаем запрос
    fResult= ::HttpSendRequest(hRequest, NULL,0, NULL,0);
              if (!fResult) throw L"HttpSendRequest Error";

    // получаем  информацию о размере данных
     fResult = HttpQueryInfo(hRequest,HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,&dwFileLength,&dwDwordLength,NULL);
    if (!fResult && (GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND))   
        dwFileLength = (DWORD)pstLRF_Params->uFileLength;
Цитата Drongo:
дату создания и имя? »
Не уверен, что можно узнать дату создания файла, а имя (это вы про названия файла?) можно парсить из data.Url.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 17:19, 16-04-2010 | #12


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата ganselo:
Ну например:
1) проверить версию, которая лежит рядом с прогой.
2) Попытаться загрузить версию > из 1). Если ошибка, то новой версии нет иначе качаем новую. »
С этим я разберусь уже, можно обновлять если размер скачиваемого обновления больше того модуля, что лежит рядом, поскольку обновлённый модуль всегда будет немного увеличиваться.
Цитата ganselo:
можно парсить из data.Url. »
Это да, смогу тоже, ищем последний слеш "/" + 1. И это будет начало нашего имени файла.

А вот с кодом, который узнаёт размер файла, опять не могу совладать, куда и как правильно его пристроить?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 19:25, 16-04-2010 | #13


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата Drongo:
куда и как правильно его пристроить? »
Ну например после создания сессии вызывать данный код.
Код я взял с инета и увы под рукой нет компилятора(... не могу проверить.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 19:33, 16-04-2010 | #14


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата ganselo:
Ну например после создания сессии вызывать данный код. »
Я так тоже подумал, но при компиляции, нагнуло 26 ошибок. И что там исправлять на что, тоже без понятия.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 19:49, 16-04-2010 | #15


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: rar download.rar
(14.1 Kb, 73 просмотров)

Вот вариант без WinInet. Используем TIdHTTP.


Изменяюсь... Не всё за архивировал.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Последний раз редактировалось ganselo, 17-04-2010 в 13:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:21, 17-04-2010 | #16


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, Да, но там только исполнимый файл, и не хватает ещё одного файла .cpp, как раз главного.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 13:39, 17-04-2010 | #17


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Drongo, перезалил.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 13:55, 17-04-2010 | #18


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


ganselo, Спасибо, вопрос решён окончательно! Из проекта нужно удалить LIBMYSQL.LIB и всё будет в порядке, я когда первый раз открыл проект, мне нагнуло ошибок, что мол, у вас нет компонента TIdHTTP, а вкладки Indy Clients у меня действительно не было, результат убирания неиспользуемых компонентов, пытался доустановить - результат нулевой, сносил билдер, уже нервничать начал, запустил в конце концов C++ Builder 2009 там всё есть, чуть подправил, всё компилится, но заставить работать так и не удалось, по всей видимости это связано с типами данных\переменных, а в этой среде я только-только осваиваюсь. В общем переустановил ещё раз Builder 6.0 все вкладки появились, скомпилилось и работает. Спасибо, ganselo!!!

P.S. Не удаляй пока что архив. Я его ещё раз перезакачаю.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 18:48, 17-04-2010 | #19


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата Drongo:
Из проекта нужно удалить LIBMYSQL.LIB »
У меня в билдере используется данная либа.

Цитата Drongo:
В общем переустановил ещё раз Builder 6.0 все вкладки появились, скомпилилось и работает. »
Ну я писал всё это в Builder 6.0.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 19:32, 17-04-2010 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Реализация обновления программы - ClientSocket и ClientServer

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Реализация конвейера на Си! NEED HELP! st031 Программирование в *nix 2 24-01-2009 10:57
C/C++ - Реализация формулы... ganselo Программирование и базы данных 1 20-01-2009 19:38
Разное - Ситема терминалов (реализация) piling Microsoft Windows 2000/XP 2 13-02-2008 22:52
Использование ClientSocket и Server fossil Программирование и базы данных 2 13-11-2004 17:23




 
Переход