Russian Qt Forum
Ноябрь 23, 2024, 12:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] отправка информации об ОС на сервер  (Прочитано 8443 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Июнь 18, 2013, 19:55 »

Здравствуйте. Хочу организовать отправку информации на веб-сервер об ОС, на которой используется мое приложение. Как это сделать? Что необходимо на стороне сервера и на стороне клиента (в последнем случае полагаю это отправка информации через сокет)?
« Последнее редактирование: Июнь 25, 2013, 01:34 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #1 : Июнь 18, 2013, 20:38 »

Таки да, нужен сокет на клиента и получение информации об ОС, правда не знаю какая именно вам нужна, ну тут уже платформо-зависимый код.

Примеры Fortune server - Fortune Client если из простого и медленного. Ну или какие-нибудь специализированные решения для большого объема.
Записан
Vass
Гость
« Ответ #2 : Июнь 18, 2013, 20:42 »

На сервере нужен скрипт, который будет обрабатывать POST запрос (раз это веб сервер), хоть на чем, хоть на PHP,
на стороне клиента нужно оправить HTTP запрос, это можно сделать очень просто с помощью QNAM
Единственное что, если нужна максимальная гарантия от накруток, то следует как минимум посылать еще какойнить идентификационный ключ, что это действительно ваша программа обратилась к адресу, а не просто ктот в браузере зашел
и тут уже достаточно много всяких способов, начиная от какого нить банального md5 от имени программы в отдельном POST поле, до всяких OAuth и иже с ними, но это уже совсем другая история.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 18, 2013, 20:46 »

POST будет в самый раз, спасибо.

накрутка неважна, после отсылки буду просто записывать ключ через QSettings — не так уж и много пользователей лазит по реестру или plist'ам чтобы удалить его оттуда и специально еще раз отправить информацию Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июнь 18, 2013, 20:48 »

Почему именно веб-сервер? Не лучше повесить на левый порт небольшой серверок для этого.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июнь 18, 2013, 20:54 »

на сервере уже находится сайт, мне просто разрешили воспользоваться сервером для моей небольшой затеи Улыбающийся

или «веб-сервер» означает не то, о чем я говорю?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 18, 2013, 20:57 »

на сервере уже находится сайт, мне просто разрешили воспользоваться сервером для моей небольшой затеи Улыбающийся

или «веб-сервер» означает не то, о чем я говорю?
Запускайте свой маленький серверок на другом порту и он будет спокойно работать с сайтом.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июнь 18, 2013, 21:02 »

серверная сторона не на мне — я обрисовал задачу, а админ сделает так, как ему удобнее (POST его устраивает).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #8 : Июнь 18, 2013, 21:06 »

//мне просто разрешили воспользоваться
http://fastvps.ru/vds/
от 4 баксов в месяц и не паришься, что можешь что-то сломать на чужом серваке

Возможные ОС:
Debian 6.0, CentOS 5.0, CentOS 6.0, Scientific Linux, Ubuntu
Записан
CuteBunny
Гость
« Ответ #9 : Июнь 20, 2013, 09:41 »

Как вариант можно отправлять отчеты и по smtp/smtps протоколу.
Мне удалось реализовать такое с помощью windows sockets api + openssl.
Работало следующим образом: на целевой машине (веб-сервер) имелся smtp-сервер (мне кажется сейчас любой хостинг провайдер предоставляет веб-серверы сразу с smpt, ftp и пр. свистелками), создали отдельную учетную запись для всех этих дел с паролем, и приложение используя эту учетку отсылало информацию о программе (только у нас это не было скрыто от пользователя, всегда запрашивалось разрешение).

smpts нужно было для того, чтобы учетную запись нельзя было легко вычислить на машине клиента, т.к. по smtp логин и пароль передаются в открытом виде, а по smtps вроде как в зашифрованном и сниффером не пронюхаешь. данные по учетке в клиенсткой программе хранились в строковых литералах поэтому их тоже нужно было защищать от возможного раскрытия. (сам лично запускал через иду и видел эти строки:)

Естественно это больше возни, чем просто отправлять http запросы на целевой хост, но мне кажется так http-сервер не будет лишний раз нагружаться.

p.s.: в кладовке готовых решений есть вроде как smtp клиент.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Июнь 20, 2013, 11:35 »

по-моему это излишние сложности. информация будет отправляться лишь один раз, да и нету столько пользователей чтобы положить сервер.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
CuteBunny
Гость
« Ответ #11 : Июнь 20, 2013, 14:25 »

по-моему это излишние сложности. информация будет отправляться лишь один раз, да и нету столько пользователей чтобы положить сервер.
Ок, я тоже считаю, что усложнять не стоит, если оно того не стоит
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Июнь 25, 2013, 01:30 »

выкладываю только код получения информации об ОС для винды и мак ос (под линукс не распространяю приложение) — всё остальное (послать POST, записать флажок в QSettings) очевидно. виндовый код я взял на МСДН и провел небольшую косметическую обработку; он выдает информацию начиная от винды2000 и заканчивая 8-й.
Код
C++ (Qt)
// Mac OS X
QByteArray getOsXInfo()
{
   QProcess proc;
 
   // Mac OS X
   proc.start("sw_vers", QStringList() << "-productName", QProcess::ReadOnly);
   proc.waitForFinished();
   QByteArray result = proc.readAllStandardOutput().trimmed() + " ";
 
   // 10.8.4
   proc.start("sw_vers", QStringList() << "-productVersion", QProcess::ReadOnly);
   proc.waitForFinished();
   result += proc.readAllStandardOutput().trimmed() + " ";
 
   // x86_64 i386
   proc.start("uname", QStringList() << "-m" << "-p", QProcess::ReadOnly);
   proc.waitForFinished();
   result += proc.readAllStandardOutput().trimmed();
 
   return result;
}
Код
C++ (Qt)
// Windows
#include <sstream>
 
// WinXP toolchain doesn't define consts below
#ifndef PRODUCT_CORE_N
#define PRODUCT_CORE_N                              0x00000062
#endif
#ifndef PRODUCT_CORE_COUNTRYSPECIFIC
#define PRODUCT_CORE_COUNTRYSPECIFIC                0x00000063
#endif
#ifndef PRODUCT_PROFESSIONAL_WMC
#define PRODUCT_PROFESSIONAL_WMC                    0x00000067
#endif
 
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); // GetNativeSystemInfo()
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); // GetProductInfo()
 
QByteArray getWinInfo()
{
   // credits: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v=vs.85).aspx (Getting the System Version)
   OSVERSIONINFOEX osvi;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
   BOOL bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi);
   if (!bOsVersionInfoEx || VER_PLATFORM_WIN32_NT != osvi.dwPlatformId || osvi.dwMajorVersion < 5)
       return QByteArray();
 
   // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise
   SYSTEM_INFO si;
   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   HMODULE kernel32Handle = GetModuleHandle(L"kernel32.dll");
   PGNSI pGNSI = (PGNSI)GetProcAddress(kernel32Handle, "GetNativeSystemInfo");
   if (pGNSI)
       pGNSI(&si);
   else
       GetSystemInfo(&si);
 
   std::stringstream os;
   // Test for the specific product
   switch (osvi.dwMajorVersion)
   {
   case 6:
   {
       switch (osvi.dwMinorVersion)
       {
       case 2:
           os << (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8" : "Windows Server 2012");
           break;
       case 1:
           os << (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 7" : "Windows Server 2008 R2");
           break;
       case 0:
           os << (osvi.wProductType == VER_NT_WORKSTATION ? "Windows Vista" : "Windows Server 2008");
           break;
       default:
           os << "Windows NEW: minor " << osvi.dwMinorVersion << ", product " << osvi.wProductType;
           break;
       }
       os << " ";
 
       DWORD dwType;
       PGPI pGPI = (PGPI)GetProcAddress(kernel32Handle, "GetProductInfo");
       pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);
       switch(dwType)
       {
       case PRODUCT_ULTIMATE:
           os << "Ultimate Edition";
           break;
       case PRODUCT_PROFESSIONAL:
           os << "Professional";
           break;
       case PRODUCT_PROFESSIONAL_N:
           os << "Professional N";
           break;
       case PRODUCT_HOME_PREMIUM:
           os << "Home Premium Edition";
           break;
       case PRODUCT_HOME_BASIC:
           os << "Home Basic Edition";
           break;
       case PRODUCT_ENTERPRISE:
           os << "Enterprise Edition";
           break;
       case PRODUCT_BUSINESS:
           os << "Business Edition";
           break;
       case PRODUCT_STARTER:
           os << "Starter Edition";
           break;
       case PRODUCT_STARTER_N:
           os << "Starter N Edition";
           break;
       case PRODUCT_CLUSTER_SERVER:
           os << "Cluster Server Edition";
           break;
       case PRODUCT_DATACENTER_SERVER:
           os << "Datacenter Edition";
           break;
       case PRODUCT_DATACENTER_SERVER_CORE:
           os << "Datacenter Edition (core installation)";
           break;
       case PRODUCT_ENTERPRISE_SERVER:
           os << "Enterprise Edition";
           break;
       case PRODUCT_ENTERPRISE_SERVER_CORE:
           os << "Enterprise Edition (core installation)";
           break;
       case PRODUCT_ENTERPRISE_SERVER_IA64:
           os << "Enterprise Edition for Itanium-based Systems";
           break;
       case PRODUCT_SMALLBUSINESS_SERVER:
           os << "Small Business Server";
           break;
       case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
           os << "Small Business Server Premium Edition";
           break;
       case PRODUCT_STANDARD_SERVER:
           os << "Standard Edition";
           break;
       case PRODUCT_STANDARD_SERVER_CORE:
           os << "Standard Edition (core installation)";
           break;
       case PRODUCT_WEB_SERVER:
           os << "Web Server Edition";
           break;
       case PRODUCT_PROFESSIONAL_WMC:
           os << "Professional with Media Center";
           break;
       case PRODUCT_CORE_N: // Windows 8 N
           os << "N";
           break;
       case PRODUCT_CORE_COUNTRYSPECIFIC:
           os << "China";
           break;
       default:
           os << "dwType " << dwType;
           break;
       }
   }
       break;
   case 5:
       switch (osvi.dwMinorVersion)
       {
       case 2:
           if (GetSystemMetrics(SM_SERVERR2))
               os << "Windows Server 2003 R2, ";
           else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
               os << "Windows Storage Server 2003";
           else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
               os << "Windows Home Server";
           else if(osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
               os << "Windows XP Professional x64 Edition";
           else
               os << "Windows Server 2003, ";
 
           // Test for the server type.
           if (osvi.wProductType != VER_NT_WORKSTATION)
           {
               if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
               {
                   if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
                       os << "Datacenter Edition for Itanium-based Systems";
                   else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
                       os << "Enterprise Edition for Itanium-based Systems";
               }
               else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
               {
                   if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
                       os << "Datacenter x64 Edition";
                   else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
                       os << "Enterprise x64 Edition";
                   else
                       os << "Standard x64 Edition";
               }
               else
               {
                   if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
                       os << "Compute Cluster Edition";
                   else if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
                       os << "Datacenter Edition";
                   else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
                       os << "Enterprise Edition";
                   else if (osvi.wSuiteMask & VER_SUITE_BLADE)
                       os << "Web Edition";
                   else
                       os << "Standard Edition";
               }
           }
           break;
       case 1:
           os << "Windows XP " << (osvi.wSuiteMask & VER_SUITE_PERSONAL ? "Home Edition" : "Professional");
           break;
       case 0:
           os << "Windows 2000 ";
           if (osvi.wProductType == VER_NT_WORKSTATION)
               os << "Professional";
           else
           {
               if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
                   os << "Datacenter Server";
               else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
                   os << "Advanced Server";
               else
                   os << "Server";
           }
           break;
       }
       break;
   default:
       os << "Windows SUPERNEW: major " << osvi.dwMajorVersion << ", minor " << osvi.dwMinorVersion << ", product " << osvi.wProductType;
       break;
   }
 
   // Include service pack (if any) and build number
//    if (wcslen(osvi.szCSDVersion) > 0)
//        os << " " << osvi.szCSDVersion;
//    os << " (build " << osvi.dwBuildNumber << ")";
 
   if (osvi.dwMajorVersion >= 6)
   {
       if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
           os << ", 64-bit";
       else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
           os << ", 32-bit";
   }
 
   return os.str().c_str();
}
« Последнее редактирование: Июнь 29, 2013, 20:03 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ubuntu_linux
Гость
« Ответ #13 : Июнь 26, 2013, 23:57 »

А как узнать загрузки процессор и рам памяти?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Июнь 27, 2013, 00:00 »

погуглить. и вообще это как бы не имеет отношения к данной теме.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.