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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать VPN l2tp соединение?  (Прочитано 5961 раз)
Robie
Гость
« : Февраль 03, 2013, 15:04 »

Здравствуйте!

Хочу спросить знающих как решить эту проблемму...
Пишу под ОС Windows, надо создать и подключится по VPN l2tp...
Гуглинг не помагает, к сожилению, единственное что нашел - так это использовать RAS API...
Но как ее использовать правильно?! Обеспокоенный
примеров так и не нашел...задайте пинком правильное направление движения Улыбающийся

Заранее благодарю за помощь
Записан
Robie
Гость
« Ответ #1 : Февраль 04, 2013, 00:21 »

 В замешательстве неужели никто никогдане создавал VPN соединение?!
Записан
Bepec
Гость
« Ответ #2 : Февраль 04, 2013, 09:03 »

VPN как бы сложная тема, на мой взгляд.
Видимо специалистов в данной области у нас не наблюдается. Будете первым Веселый
Записан
Командор
Гость
« Ответ #3 : Февраль 04, 2013, 11:16 »

Лет 5 назад делал подобное (звонилка для провайдера)

Код:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#pragma comment(lib, "rasapi32.lib")
#pragma comment(lib, "Mpr.lib")

#include <windows.h>
#include <windowsx.h>
#include <ras.h>
#include <shellapi.h>
#include <commdlg.h>
#include <rasdlg.h>
#include <raserror.h>
#include <commctrl.h>
#include <string>
#include <sstream>

using namespace std;

class Vpn
{
private:
    DWORD dwRet;
    HRASCONN connection;

public:
    LPCWSTR vpnName;
    LPCWSTR vpnAdress;
    LPCWSTR vpnLogin;
    LPCWSTR vpnPassword;

    Vpn()
    {
        vpnName = TEXT("VPN-connection");
        vpnAdress = TEXT("");
        vpnLogin = TEXT("client1");
        vpnPassword = TEXT("client1");
    }

    void create()
    {
        RASENTRY RS;
        memset(&RS, 0, sizeof(RASENTRY));
        RS.dwSize = sizeof(RS);
        RS.dwfOptions =
                //RASEO_PreviewUserPw |
                //RASEO_ModemLights |
                // RASEO_PreviewDomain |        // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows")
                RASEO_ShowDialingProgress |     // вкладка "Параметры" - Параметры набора номера: установить флажок "Отображать ход подключения"
                RASEO_RemoteDefaultGateway |    // вкладка "Сеть" - "Протокол Интернета (TCP/IP)" - кнопка "Дополнительно" - установить флажок "Использовать основной шлюз в удаленной сети"
                RASEO_SwCompression |           // вкладка "Сеть" - кнопка "Параметры" - установить флажок "Использовать программное сжатие данных"
                // RASEO_RequirePAP |           // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Незашифрованный пароль (PAP)"
                // RASEO_RequireSPAP |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Shiva (SPAP)"
                RASEO_RequireCHAP |             // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля CHAP"
                // RASEO_RequireMsCHAP |        // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP)"
                // RASEO_RequireW95MSCHAP |     // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Разрешить старый протокол MS-CHAP для Windows 95"
                RASEO_RequireMsCHAP2 |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP v2)"
                RASEO_SecureLocalFiles;          // вкладка "Сеть" - Компоненты, используемые этим подключением: снять флажок "Использовать основной шлюз в удаленной сети";
        RS.dwfOptions2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
        RS.dwfNetProtocols = RASNP_Ip;             // протокол Интернета
        RS.dwFramingProtocol = RASFP_Ppp;            // протокол Point-to-Point Protocol
        RS.dwType = RASET_Vpn;      // тип подключения RASET_Broadband
        RS.dwVpnStrategy = VS_Default;           // вкладка "Сеть" - По умолчанию
        RS.dwEncryptionType = ET_Optional;          // параметры шифрования (ET_None, ET_Require, ET_RequireMax, ET_Optional)
        RS.dwDialMode = RASEDM_DialAll;
        RS.dwRedialCount = 99;                   // число повторов набора номера
        RS.dwRedialPause = 120;                  // интервал между повторениями
        lstrcpy(RS.szLocalPhoneNumber, vpnAdress);
        lstrcpy(RS.szDeviceType, TEXT("VPN"));             // RASDT_PPPoE - обуславливает тип подключения (PPPoE)
        lstrcpy(RS.szDeviceName, TEXT("VPN"));

        dwRet = RasSetEntryProperties(NULL, vpnName, &RS, sizeof(RS), NULL, 0);
    }

    void open()
    {
        RASDIALPARAMS dial_params;
        dial_params.dwSize = sizeof(RASDIALPARAMS);
        wcscpy(dial_params.szEntryName, vpnName);
        wcscpy(dial_params.szPhoneNumber, L"");
        wcscpy(dial_params.szCallbackNumber, L"");
        wcscpy(dial_params.szUserName, vpnLogin);
        wcscpy(dial_params.szPassword, vpnPassword);
        wcscpy(dial_params.szDomain, L"");
        dial_params.dwSubEntry = 0;
        dial_params.dwCallbackId = 0;
        connection = NULL;
        dwRet = RasDial(NULL, NULL, &dial_params, 0, NULL, &connection);
    }

    void hangUp()
    {
        RASCONN ras[20];
        DWORD  dSize, dNumber;

        ras[0].dwSize = sizeof(RASCONN);
        dSize = sizeof( ras );
        dwRet = RasEnumConnections(ras, &dSize, &dNumber);
        if (dwRet != 0) {
            return;
        }
        for (DWORD dCount = 0; dCount < dNumber; dCount++) {
            if (!_wcsicmp(ras[dCount].szEntryName, vpnName)) {
                HRASCONN hRasConn = ras[dCount].hrasconn;
                dwRet = RasHangUp(hRasConn);
                if (dwRet == 0)
                    //Info("Информация", "Cоединение разорвано");
                    int i = 0;
            }
        }
    }

    void start()
    {
        open();
        if (dwRet != 0) {
            if (dwRet == ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) {
                create(); // Если соединения нет, то создаем
                if (dwRet != 0)
                    //Info("Ошибка", "Невозможно создать VPN-соединение");
                    int i = 0;
                else
                    open();
            }
        }
        if (dwRet == 0)
            //Info("Информация", "Установлено соединение");
            int i = 0;
        else
            //Info("Ошибка", "Невозможно установить VPN-соединение");
            int i = 0;
    }
};

« Последнее редактирование: Февраль 04, 2013, 11:46 от Командор » Записан
Robie
Гость
« Ответ #4 : Февраль 04, 2013, 21:11 »

VPN как бы сложная тема, на мой взгляд.
Видимо специалистов в данной области у нас не наблюдается. Будете первым Веселый

 Подмигивающий Главное чтобы стал успешным первопроходцем Веселый
« Последнее редактирование: Февраль 04, 2013, 21:13 от Robie » Записан
Robie
Гость
« Ответ #5 : Февраль 04, 2013, 21:12 »

Лет 5 назад делал подобное (звонилка для провайдера)

Код:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#pragma comment(lib, "rasapi32.lib")
#pragma comment(lib, "Mpr.lib")

#include <windows.h>
#include <windowsx.h>
#include <ras.h>
#include <shellapi.h>
#include <commdlg.h>
#include <rasdlg.h>
#include <raserror.h>
#include <commctrl.h>
#include <string>
#include <sstream>

using namespace std;

class Vpn
{
private:
    DWORD dwRet;
    HRASCONN connection;

public:
    LPCWSTR vpnName;
    LPCWSTR vpnAdress;
    LPCWSTR vpnLogin;
    LPCWSTR vpnPassword;

    Vpn()
    {
        vpnName = TEXT("VPN-connection");
        vpnAdress = TEXT("");
        vpnLogin = TEXT("client1");
        vpnPassword = TEXT("client1");
    }

    void create()
    {
        RASENTRY RS;
        memset(&RS, 0, sizeof(RASENTRY));
        RS.dwSize = sizeof(RS);
        RS.dwfOptions =
                //RASEO_PreviewUserPw |
                //RASEO_ModemLights |
                // RASEO_PreviewDomain |        // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows")
                RASEO_ShowDialingProgress |     // вкладка "Параметры" - Параметры набора номера: установить флажок "Отображать ход подключения"
                RASEO_RemoteDefaultGateway |    // вкладка "Сеть" - "Протокол Интернета (TCP/IP)" - кнопка "Дополнительно" - установить флажок "Использовать основной шлюз в удаленной сети"
                RASEO_SwCompression |           // вкладка "Сеть" - кнопка "Параметры" - установить флажок "Использовать программное сжатие данных"
                // RASEO_RequirePAP |           // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Незашифрованный пароль (PAP)"
                // RASEO_RequireSPAP |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Shiva (SPAP)"
                RASEO_RequireCHAP |             // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля CHAP"
                // RASEO_RequireMsCHAP |        // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP)"
                // RASEO_RequireW95MSCHAP |     // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Разрешить старый протокол MS-CHAP для Windows 95"
                RASEO_RequireMsCHAP2 |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP v2)"
                RASEO_SecureLocalFiles;          // вкладка "Сеть" - Компоненты, используемые этим подключением: снять флажок "Использовать основной шлюз в удаленной сети";
        RS.dwfOptions2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
        RS.dwfNetProtocols = RASNP_Ip;             // протокол Интернета
        RS.dwFramingProtocol = RASFP_Ppp;            // протокол Point-to-Point Protocol
        RS.dwType = RASET_Vpn;      // тип подключения RASET_Broadband
        RS.dwVpnStrategy = VS_Default;           // вкладка "Сеть" - По умолчанию
        RS.dwEncryptionType = ET_Optional;          // параметры шифрования (ET_None, ET_Require, ET_RequireMax, ET_Optional)
        RS.dwDialMode = RASEDM_DialAll;
        RS.dwRedialCount = 99;                   // число повторов набора номера
        RS.dwRedialPause = 120;                  // интервал между повторениями
        lstrcpy(RS.szLocalPhoneNumber, vpnAdress);
        lstrcpy(RS.szDeviceType, TEXT("VPN"));             // RASDT_PPPoE - обуславливает тип подключения (PPPoE)
        lstrcpy(RS.szDeviceName, TEXT("VPN"));

        dwRet = RasSetEntryProperties(NULL, vpnName, &RS, sizeof(RS), NULL, 0);
    }

    void open()
    {
        RASDIALPARAMS dial_params;
        dial_params.dwSize = sizeof(RASDIALPARAMS);
        wcscpy(dial_params.szEntryName, vpnName);
        wcscpy(dial_params.szPhoneNumber, L"");
        wcscpy(dial_params.szCallbackNumber, L"");
        wcscpy(dial_params.szUserName, vpnLogin);
        wcscpy(dial_params.szPassword, vpnPassword);
        wcscpy(dial_params.szDomain, L"");
        dial_params.dwSubEntry = 0;
        dial_params.dwCallbackId = 0;
        connection = NULL;
        dwRet = RasDial(NULL, NULL, &dial_params, 0, NULL, &connection);
    }

    void hangUp()
    {
        RASCONN ras[20];
        DWORD  dSize, dNumber;

        ras[0].dwSize = sizeof(RASCONN);
        dSize = sizeof( ras );
        dwRet = RasEnumConnections(ras, &dSize, &dNumber);
        if (dwRet != 0) {
            return;
        }
        for (DWORD dCount = 0; dCount < dNumber; dCount++) {
            if (!_wcsicmp(ras[dCount].szEntryName, vpnName)) {
                HRASCONN hRasConn = ras[dCount].hrasconn;
                dwRet = RasHangUp(hRasConn);
                if (dwRet == 0)
                    //Info("Информация", "Cоединение разорвано");
                    int i = 0;
            }
        }
    }

    void start()
    {
        open();
        if (dwRet != 0) {
            if (dwRet == ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) {
                create(); // Если соединения нет, то создаем
                if (dwRet != 0)
                    //Info("Ошибка", "Невозможно создать VPN-соединение");
                    int i = 0;
                else
                    open();
            }
        }
        if (dwRet == 0)
            //Info("Информация", "Установлено соединение");
            int i = 0;
        else
            //Info("Ошибка", "Невозможно установить VPN-соединение");
            int i = 0;
    }
};


 :)Хоть кто-то...
Большущее спасибо!!! Улыбающийся
Записан
Robie
Гость
« Ответ #6 : Февраль 05, 2013, 00:44 »

Лет 5 назад делал подобное (звонилка для провайдера)

Код:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#pragma comment(lib, "rasapi32.lib")
#pragma comment(lib, "Mpr.lib")

#include <windows.h>
#include <windowsx.h>
#include <ras.h>
#include <shellapi.h>
#include <commdlg.h>
#include <rasdlg.h>
#include <raserror.h>
#include <commctrl.h>
#include <string>
#include <sstream>

using namespace std;

class Vpn
{
private:
    DWORD dwRet;
    HRASCONN connection;

public:
    LPCWSTR vpnName;
    LPCWSTR vpnAdress;
    LPCWSTR vpnLogin;
    LPCWSTR vpnPassword;

    Vpn()
    {
        vpnName = TEXT("VPN-connection");
        vpnAdress = TEXT("");
        vpnLogin = TEXT("client1");
        vpnPassword = TEXT("client1");
    }

    void create()
    {
        RASENTRY RS;
        memset(&RS, 0, sizeof(RASENTRY));
        RS.dwSize = sizeof(RS);
        RS.dwfOptions =
                //RASEO_PreviewUserPw |
                //RASEO_ModemLights |
                // RASEO_PreviewDomain |        // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows")
                RASEO_ShowDialingProgress |     // вкладка "Параметры" - Параметры набора номера: установить флажок "Отображать ход подключения"
                RASEO_RemoteDefaultGateway |    // вкладка "Сеть" - "Протокол Интернета (TCP/IP)" - кнопка "Дополнительно" - установить флажок "Использовать основной шлюз в удаленной сети"
                RASEO_SwCompression |           // вкладка "Сеть" - кнопка "Параметры" - установить флажок "Использовать программное сжатие данных"
                // RASEO_RequirePAP |           // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Незашифрованный пароль (PAP)"
                // RASEO_RequireSPAP |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Shiva (SPAP)"
                RASEO_RequireCHAP |             // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля CHAP"
                // RASEO_RequireMsCHAP |        // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP)"
                // RASEO_RequireW95MSCHAP |     // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Разрешить старый протокол MS-CHAP для Windows 95"
                RASEO_RequireMsCHAP2 |          // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP v2)"
                RASEO_SecureLocalFiles;          // вкладка "Сеть" - Компоненты, используемые этим подключением: снять флажок "Использовать основной шлюз в удаленной сети";
        RS.dwfOptions2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
        RS.dwfNetProtocols = RASNP_Ip;             // протокол Интернета
        RS.dwFramingProtocol = RASFP_Ppp;            // протокол Point-to-Point Protocol
        RS.dwType = RASET_Vpn;      // тип подключения RASET_Broadband
        RS.dwVpnStrategy = VS_Default;           // вкладка "Сеть" - По умолчанию
        RS.dwEncryptionType = ET_Optional;          // параметры шифрования (ET_None, ET_Require, ET_RequireMax, ET_Optional)
        RS.dwDialMode = RASEDM_DialAll;
        RS.dwRedialCount = 99;                   // число повторов набора номера
        RS.dwRedialPause = 120;                  // интервал между повторениями
        lstrcpy(RS.szLocalPhoneNumber, vpnAdress);
        lstrcpy(RS.szDeviceType, TEXT("VPN"));             // RASDT_PPPoE - обуславливает тип подключения (PPPoE)
        lstrcpy(RS.szDeviceName, TEXT("VPN"));

        dwRet = RasSetEntryProperties(NULL, vpnName, &RS, sizeof(RS), NULL, 0);
    }

    void open()
    {
        RASDIALPARAMS dial_params;
        dial_params.dwSize = sizeof(RASDIALPARAMS);
        wcscpy(dial_params.szEntryName, vpnName);
        wcscpy(dial_params.szPhoneNumber, L"");
        wcscpy(dial_params.szCallbackNumber, L"");
        wcscpy(dial_params.szUserName, vpnLogin);
        wcscpy(dial_params.szPassword, vpnPassword);
        wcscpy(dial_params.szDomain, L"");
        dial_params.dwSubEntry = 0;
        dial_params.dwCallbackId = 0;
        connection = NULL;
        dwRet = RasDial(NULL, NULL, &dial_params, 0, NULL, &connection);
    }

    void hangUp()
    {
        RASCONN ras[20];
        DWORD  dSize, dNumber;

        ras[0].dwSize = sizeof(RASCONN);
        dSize = sizeof( ras );
        dwRet = RasEnumConnections(ras, &dSize, &dNumber);
        if (dwRet != 0) {
            return;
        }
        for (DWORD dCount = 0; dCount < dNumber; dCount++) {
            if (!_wcsicmp(ras[dCount].szEntryName, vpnName)) {
                HRASCONN hRasConn = ras[dCount].hrasconn;
                dwRet = RasHangUp(hRasConn);
                if (dwRet == 0)
                    //Info("Информация", "Cоединение разорвано");
                    int i = 0;
            }
        }
    }

    void start()
    {
        open();
        if (dwRet != 0) {
            if (dwRet == ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) {
                create(); // Если соединения нет, то создаем
                if (dwRet != 0)
                    //Info("Ошибка", "Невозможно создать VPN-соединение");
                    int i = 0;
                else
                    open();
            }
        }
        if (dwRet == 0)
            //Info("Информация", "Установлено соединение");
            int i = 0;
        else
            //Info("Ошибка", "Невозможно установить VPN-соединение");
            int i = 0;
    }
};


 :)Дружище, не знаю как тебе выразить свою благодарность, ты спас мой мозг от саморозплавления(сколько я намучился с ошибками в моем коде...)...а у тебя отличный код и все хорошо читается и что самое главное,- все работает!
Записан
Bepec
Гость
« Ответ #7 : Февраль 05, 2013, 00:52 »

А если дальше хотите жить на форуме, отучайтесь цитировать простыни кода Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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