Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15

Нужно максимально упростить код

18.12.2021, 10:07. Показов 2470. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи, так как WinAPI не понимаю совсем.
Дали код, который выводит внешний IP. Код рабочий, для компиляции на Win10 нужно добавить команду -lwinhttp.
Но мне пока не понятно, для чего нужен цикл do {} while;, так как вторая итерация выводит в переменную мусор. Попробовал убрать этот цикл и вроде все работает. Возможно еще есть что лишнее в этом коде, прошу максимально упростить.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winhttp.h>
 
int main(void) {
    
  DWORD dwSize = 0;
  DWORD dwDownloaded = 0;
  LPSTR pszOutBuffer;
  BOOL  bResults = FALSE;
  HINTERNET  hSession = NULL, 
             hConnect = NULL,
             hRequest = NULL;
  // Use WinHttpOpen to obtain a session handle.
  hSession = WinHttpOpen( L"WinHTTP Example/1.0",  
                          WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                          WINHTTP_NO_PROXY_NAME, 
                          WINHTTP_NO_PROXY_BYPASS, 0 );
 
  // Specify an HTTP server.
  if( hSession )
    hConnect = WinHttpConnect( hSession, L"myexternalip.com",
                               INTERNET_DEFAULT_HTTPS_PORT, 0 );
 
  // Create an HTTP request handle.
  if( hConnect )
    hRequest = WinHttpOpenRequest( hConnect, L"GET", L"/raw",
                                   NULL, WINHTTP_NO_REFERER, 
                                   WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                   WINHTTP_FLAG_SECURE );
 
  // Send a request.
  if( hRequest )
    bResults = WinHttpSendRequest( hRequest,
                                   WINHTTP_NO_ADDITIONAL_HEADERS, 0,
                                   WINHTTP_NO_REQUEST_DATA, 0, 
                                   0, 0 );
 
 
  // End the request.
  if( bResults )
    bResults = WinHttpReceiveResponse( hRequest, NULL );
 
  // Keep checking for data until there is nothing left.
  if( bResults )
  {
    do 
    {
      // Check for available data.
      dwSize = 0;
      if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )
        printf( "Error %u in WinHttpQueryDataAvailable.\n",
                GetLastError( ) );
 
      // Allocate space for the buffer.
      pszOutBuffer = (LPSTR) malloc(dwSize+1);
      if( !pszOutBuffer )
      {
        printf( "Out of memory\n" );
        dwSize=0;
      }
      else
      {
        // Read the data.
        ZeroMemory( pszOutBuffer, dwSize+1 );
 
        if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
                              dwSize, &dwDownloaded ) )
          printf( "Error %u in WinHttpReadData.\n", GetLastError( ) );
        else
          printf( "%s", pszOutBuffer );
 
        // Free the memory allocated to the buffer.
        free((LPVOID) pszOutBuffer);
      }
    } while( dwSize > 0 );
  }
 
 
  // Report any errors.
  if( !bResults )
    printf( "Error %d has occurred.\n", GetLastError( ) );
 
  // Close any open handles.
  if( hRequest ) WinHttpCloseHandle( hRequest );
  if( hConnect ) WinHttpCloseHandle( hConnect );
  if( hSession ) WinHttpCloseHandle( hSession );
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2021, 10:07
Ответы с готовыми решениями:

Максимально упростить код
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;iomanip&gt; using namespace std; #define N 3 struct note { char name; ...

можно ли упростить этот код ,код не мой просто нужно чтобы он был проще)
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;string&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include...

Нужно упростить код
Помогите пожалуйста упростить код. Дана матрица размера M × N. Вывести ее элементы в следующем порядке: первая, вторая строки - по...

3
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
18.12.2021, 20:09
Лучший ответ Сообщение было отмечено мама Стифлера как решение

Решение

мама Стифлера,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <winhttp.h>
#include <string>
 
int main()
{
    // Use WinHttpOpen to obtain a session handle.
    if(HINTERNET hSession = WinHttpOpen(L"WinHTTP Example/1.0",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 ))
    {
        // Specify an HTTP server.
        if(HINTERNET hConnect=WinHttpConnect( hSession, L"myexternalip.com",INTERNET_DEFAULT_HTTPS_PORT, 0 ))
        {
            // Create an HTTP request handle.
            if(HINTERNET hRequest=WinHttpOpenRequest( hConnect, L"GET", L"/raw", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE ))
            {
                // Send a request.
                BOOL ok{};
                [&]
                {
                    ok=WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );
                    if(!ok)return;
 
                    // End the request.
                    ok=WinHttpReceiveResponse( hRequest, NULL );
                    if(!ok)return;
 
                    // Keep checking for data until there is nothing left.
                    // Check for available data.
                    DWORD dwSize = 0;
                    if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )
                    {
                        printf( "Error %u in WinHttpQueryDataAvailable.\n", (uint32_t)GetLastError() );
                        ok=false;
                        return;
                    }
 
                    if(dwSize==0)
                    {
                        printf( "dwSize==0\n" );
                        ok=false;
                        return;
                    }
 
                    // Allocate space for the buffer.
                    std::string str;
                    try
                    {
                        str.resize(size_t{dwSize}+1,'\0');
                    }
                    catch(...)
                    {
                        printf( "Out of memory\n" );
                        ok=false;
                        return;
                    }
 
                    // Read the data.
                    DWORD dwDownloaded = 0;
                    if( !WinHttpReadData( hRequest, str.data(), str.size()-1, &dwDownloaded ) )
                    {
                        printf( "Error %u in WinHttpReadData.\n", (uint32_t)GetLastError() );
                        ok=false;
                        return;
                    }
                    else
                    {
                        while(str.size() && str.back()=='\0'){str.resize(str.size()-1);}
                        printf( "%s", str.c_str() );
                    }
                }();
 
                // Report any errors.
                if(!ok)
                {
                    printf( "Error %d has occurred.\n", (uint32_t)GetLastError( ) );
                }
 
                // Close any open handles.
                WinHttpCloseHandle(hRequest);
            }
 
            WinHttpCloseHandle(hConnect);
        }
 
        WinHttpCloseHandle(hSession);
    }
 
    return 0;
}
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
19.12.2021, 21:33  [ТС]
Алексей1153, а вот есть еще другой код
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//подключаем необходимые заголовочные файлы
#include <string.h>
#include <stdio.h>
#include <curl/curl.h>
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объялвяем буфер принимаемых данных
static char buffer[1024];
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, char* buffer)
{
  //переменная - результат, по умолчанию нулевая
  int result = 0;
  //проверяем буфер
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    strncat(buffer, data, size*nmemb);
    //вычисляем объем принятых данных
    result = size * nmemb;
  }
  //вовзращаем результат
  return result;
}
 
//главная функция
int main(void)
{
    //необходимые CURL объекты
    CURL *curl;
    CURLcode result;
    //инициализируем curl
    curl = curl_easy_init();
    //проверяем результат инициализации
    if (curl)
    {
      //задаем все необходимые опции
      //определяем, куда выводить ошибки
      curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      //задаем опцию - получить страницу по адресу [url]http://google.com[/url]
      curl_easy_setopt(curl, CURLOPT_URL, "http://myexternalip.com/raw");
      //указываем прокси сервер
//      curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
      //задаем опцию отображение заголовка страницы
//      curl_easy_setopt(curl, CURLOPT_HEADER, 1);
      //указываем функцию обратного вызова для записи получаемых данных
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      //указываем куда записывать принимаемые данные
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
      //запускаем выполнение задачи
      result = curl_easy_perform(curl);
      //проверяем успешность выполнения операции
      if (result == CURLE_OK)      
      //выводим полученные данные на стандартный вывод (консоль)
        puts(buffer);
      else      
        //выводим сообщение об ошибке
        printf("Error: %s",errorBuffer);
  }
  //завершаем сессию
  curl_easy_cleanup(curl);
  return 0;
}

Какой из них менее ресурсоемкий, этот, или с поста#2? Предполагается, что он будет работать в фоне постоянно.
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
19.12.2021, 21:37
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Какой из них менее ресурсоемкий
одинаковые (в моём варианте можно сделать std::string str; глобальной переменной, например. Чтобы реаллокаций не было при каждом вызове. И, конечно, если это всё будет оформлено процедурой, так как main-то вызывается единожды)

но курл нужно прикручивать и таскать с приложением, а винапи - всегда есть в системе
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2021, 21:37
Помогаю со студенческими работами здесь

Нужно упростить код, сложение столбцов матрицы
нужно упростить код, сложение столбцов. void k2 (int **myArray, int n, int m) { clrscr(); int i, j; //Счетчик int y; // число n...

Шифрование строки методом гаммирования (нужно упростить код)
Всем привет! Ребята, есть программа которая шифрует входную строку методом гаммирования, но здесь куча всего непонятного типа iterator,...

Можно ли как то упростить код? Функцию strncpy нужно оставить
код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace std; int...

Нужно упростить код
Delphi 10, MS Access 10, AdoQuery Добрый день. Помогите упростить код. Есть база: Пункт обменна валют. В ней таблица...

Нужно упростить код
Есть вот такой код, но он слишком громоздкий для моих проверяющих. Мне советуют разбить код на методы. Но я не понимаю как это реализовать....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru