Настройка прокси соединения без измений в реестре. С++.

Discussion in 'Статьи' started by artetch, 18 Nov 2006.

Thread Status:
Not open for further replies.
  1. artetch

    artetch New Member

    Joined:
    17 Oct 2006
    Messages:
    5
    Likes Received:
    4
    Reputations:
    6
    Интернет соединение через прокси сервер. Настройка прокси соединения без измений в реестре. С++.


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

    Очевидно, что перспектива сэкономить, не говоря уже об увеличении безопасности локальной сети с использованием прокси, ведёт к распространению такого вида организации интернет подключений. Поэтому при разработке сетевого приложения следует учесть то, что Ваша программа должна уметь работать через прокси соединение. Иначе приложение просто не сможет выполнять возложенные на него задачи.

    Итак, здесь ниже будет приведён пример рабочего кода написанного на С++ с использованием Windows API.


    UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);


    Собственно говоря, настройка прокси осуществляется вызовом функции UrlMkSetSessionOption, которая устанавливает свойства( или иначе) опции текущего интернет соединения. (Внимание: эти опции применяются только для текущего соединения и реестр виндовс при этом, остаётся неизменным!) Первый параметр функции – это название той опции, значение которой требуется изменить. В нашем случае это INTERNET_OPTION_PROXY. Второй параметр – данные для установки параметров прокси. За это отвечает структура INTERNET_PROXY_INFO:

    typedef struct {
    DWORD dwAccessType;
    LPCTSTR lpszProxy;
    LPCTSTR lpszProxyBypass;
    } INTERNET_PROXY_INFO, *LPINTERNET_PROXY_INFO;

    Здесь
    dwAccessType
    Тип доступа. Может принимать следующие значения:


    Значение
    Описание

    INTERNET_OPEN_TYPE_DIRECT Интернет доступ через прямое соединение(без прокси)
    INTERNET_OPEN_TYPE_PRECONFIG Применяется только при установке настроек прокси
    INTERNET_OPEN_TYPE_PROXY Интернет доступ используя прокси



    lpszProxy
    Указатель на строку содержащую список прокси серверов.
    lpszProxyBypass
    Указатель на строку содержащую список тех кому не надо использовать прокси.

    Установим настройки прокси:

    IntInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    IntInfo.lpszProxy = “10.10.0.1”; //адрес прокси сервера
    IntInfo.lpszProxyBypass = "";

    Последний параметр функции UrlMkSetSessionOption зарезирвирован и должен равняться 0. Настройка прокси соединения осуществляется вызовом этой функции, которая в свою очередь, производит вызов функции InternetSetOption. Это функция и устанавливает выбранные нами опции для текущего интернет соединения.

    Для того чтобы использовать функцию UrlMkSetSessionOption её следует предварительно загрузить из библиотеки urlmon.dll следующим образом:

    BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
    HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
    If (hPsApi == NULL)
    ShowMessage("URLMON.DLL not found!");
    *(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
    if(_UrlMkSetSessionOption == NULL)
    ShowMessage("UrlMkSetSessionOption not found!");

    Итак, код, который установит Ваши настройки для прокси соединения, выглядит так:

    BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
    HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
    If (hPsApi == NULL)
    ShowMessage("URLMON.DLL not found!");
    *(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
    if(_UrlMkSetSessionOption == NULL)
    ShowMessage("UrlMkSetSessionOption not found!");
    INTERNET_PROXY_INFO IntInfo;
    IntInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    IntInfo.lpszProxy = “10.10.0.1”; //адрес прокси сервера
    IntInfo.lpszProxyBypass = "";
    _UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);


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

    BOOL (WINAPI * _UrlMkSetSessionOption)(DWORD, LPVOID, DWORD, DWORD);
    HINSTANCE hPsApi = LoadLibrary(_T("URLMON.DLL"));
    If (hPsApi == NULL)
    ShowMessage("URLMON.DLL not found!");
    *(FARPROC *)&_UrlMkSetSessionOption = GetProcAddress(hPsApi,"UrlMkSetSessionOption");
    if(_UrlMkSetSessionOption == NULL)
    ShowMessage("UrlMkSetSessionOption not found!");
    INTERNET_PROXY_INFO IntInfo;
    IntInfo.dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
    IntInfo.lpszProxy = “”;
    IntInfo.lpszProxyBypass = "";
    _UrlMkSetSessionOption(INTERNET_OPTION_PROXY, &IntInfo, sizeof(IntInfo), 0);

    Надеюсь эта статья поможет Вам при написании собственных программ. Удачи.
     
Thread Status:
Not open for further replies.