![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Реализация обновления программы - ClientSocket и ClientServer |
|
C/C++ - [решено] Реализация обновления программы - ClientSocket и ClientServer
|
Будем жить, Маэстро... Сообщения: 6694 |
Привет. Заранее приношу извинение если буду использовать неверную терминологию, но до недавнего времени у меня небыло необходимости в использовании этих компонентов и самой технологии. Задача в общем-то такова, есть клиет-программа, на сервере есть обновления к этой программе, нужно по нажатию на кнопку\пункт меню "Обновить", чтобы программа скачала только те модули, которые новее тех, которые присутствуют рядом с программой. Аналог такого обновления, любой антивирус или AVZ. Поискал в сети, нашёл статью - Передача файлов в C++Builder через TClientSocket и TServerSocket. По примеру сделал тестовую программу, в рамках одного компьютера она работает, но там, в примере, есть клиентская часть и серверная.
Вот представьте, что наше обновление - этот файл - QuickKiller_2.20.7z нужно скачать и находится он здесь - http://tools.oszone.net/Drongo/QuickKiller_2.20.7z. Но скачивать нужно как обновление (как менеджер закачек), а не через диалоговое окно "Сохранить файл". Архив простенького проекта прикрепил, собирал по примеру выше, при нажатии на кнопку "Скачать" устанавливает соединение и на этом всё. Собственно, я не знаю в какую сторону смотреть и те ли компоненты, которые я выбрал, нужны для этих целей? Среда разработки Цитата:
|
||
------- Отправлено: 20:43, 14-04-2010 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать ganselo, Ух, класс, здорово. Получилось.
![]() А как теперь реализовать эту часть? Цитата Drongo:
... 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{ //не считали, пытаемся повторить скачивание ... |
|
------- Отправлено: 15:09, 16-04-2010 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать Цитата 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:
|
|||
------- Отправлено: 17:19, 16-04-2010 | #12 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата ganselo:
Цитата ganselo:
А вот с кодом, который узнаёт размер файла, опять не могу совладать, куда и как правильно его пристроить? ![]() |
||
------- Отправлено: 19:25, 16-04-2010 | #13 |
![]() Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Drongo:
Код я взял с инета и увы под рукой нет компилятора(... не могу проверить. |
|
------- Отправлено: 19:33, 16-04-2010 | #14 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата ganselo:
|
|
------- Отправлено: 19:49, 16-04-2010 | #15 |
![]() Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать Вот вариант без WinInet. Используем TIdHTTP.
Изменяюсь... Не всё за архивировал. |
------- Последний раз редактировалось ganselo, 17-04-2010 в 13:54. Отправлено: 00:21, 17-04-2010 | #16 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать ganselo, Да, но там только исполнимый файл, и не хватает ещё одного файла .cpp, как раз главного.
![]() |
------- Отправлено: 13:39, 17-04-2010 | #17 |
![]() Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать Drongo, перезалил.
|
------- Отправлено: 13:55, 17-04-2010 | #18 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать ganselo, Спасибо, вопрос решён окончательно!
![]() P.S. Не удаляй пока что архив. Я его ещё раз перезакачаю. |
------- Отправлено: 18:48, 17-04-2010 | #19 |
![]() Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 19:32, 17-04-2010 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Реализация конвейера на Си! 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 |
|