RasDial возвращает 633 (порт используется), но это не так.

Я могу отлично подключиться к своей VPN через интерфейс RasDial графического интерфейса Windows, а также его эквивалент в интерфейсе командной строки (c:\windows\rasdial.exe). Однако при попытке автоматизировать его в C RasDial возвращает 633: ERROR_PORT_NOT_AVAILABLE (источник)

Это не относится ко мне. Я протестировал его на четырех разных компьютерах, каждый с отдельным подключением к Интернету.

Вот мой исходный код:

#include <windows.h>
#include <winerror.h>
#include <Ras.h>
#include <raserror.h>
#include <wchar.h>
#include <stdio.h>

int EnumConnections();
int DialOut();
int HangUp();
int Debug();

int main()
{
    printf("Dial out return code: %d\n", DialOut());
    printf("Debug status: %i\n", Debug());
    EnumConnections();
    HangUp();
    return 0;
}

int EnumConnections()
{
    DWORD dwCb = 0;
    DWORD dwRet = ERROR_SUCCESS;
    DWORD dwConnections = 0;
    LPRASCONN lpRasConn = NULL;
    if (dwRet == ERROR_BUFFER_TOO_SMALL)
    {

        lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
        if (lpRasConn == NULL){
            wprintf(L"HeapAlloc failed!\n");
            return 0;
        }

        lpRasConn[0].dwSize = sizeof(RASCONN);

        dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);

        if (ERROR_SUCCESS == dwRet){
            wprintf(L"The following RAS connections are currently active:\n");
            DWORD i;
            for (i = 0; i < dwConnections; i++){
                         wprintf(L"%s\n", lpRasConn[i].szEntryName);
                  }
        }

        HeapFree(GetProcessHeap(), 0, lpRasConn);
        lpRasConn = NULL;
    }

    if(dwConnections >= 1)
        wprintf(L"The operation failed to acquire the buffer size.\n");

    else
        wprintf(L"There are no active RAS connections.\n");

    return 0;
}

int DialOut()
{
    LPCTSTR pbkLoc = "C:\\rasphone.pbk\0";
    char* szPhoneNumberToDial = "127.0.0.1";
    char* szUserName = "test\0";
    char* szPassword = "test\0";
    RASDIALPARAMS rdParams;
    rdParams.dwSize = sizeof(RASDIALPARAMS);
    rdParams.szEntryName[0] = '\0';
    lstrcpy(rdParams.szPhoneNumber, szPhoneNumberToDial);
    rdParams.szCallbackNumber[0] = '\0';
    lstrcpy( rdParams.szUserName, szUserName );
    lstrcpy( rdParams.szPassword, szPassword );
    rdParams.szDomain[0] = '\0';

    HRASCONN hRasConn = NULL;
    return RasDial(NULL, pbkLoc, &rdParams, 0L, NULL, &hRasConn);
}

int HangUp()
{
    printf("Hung up\n");
    HRASCONN hRasConn = NULL;
    return RasHangUp(hRasConn);
}

int Debug()
{
    RASCONNSTATUS RasConnStatus;
    HRASCONN hRasConn = NULL;
    RasConnStatus.dwSize = sizeof(RasConnStatus);
    return RasGetConnectStatus(hRasConn,&RasConnStatus);
}

Любые идеи? Я действительно застрял здесь. Я прочитал ВСЮ документацию RasDial. Я до сих пор не знаю, с чего начать.


person John    schedule 30.06.2012    source источник
comment
Проверьте свою функцию EnumConnections (). здесь вы получите правильный msdn .microsoft.com / en-us / library / windows / desktop /   -  person 2vision2    schedule 22.08.2012


Ответы (1)


Для подключения к VPN-соединениям у вас должна быть запись в телефонной книге. RasDial может подключаться только к коммутируемым соединениям, если запись не была предоставлена. Как еще он мог узнать, использовать ли PPTP, L2TP, SSTP и т. Д.?

Основываясь на приведенном выше примере, имя записи, которое вы предоставляете для записи, представляет собой строку с завершающим нулем без имени записи. Вам нужно будет создать запись со всей информацией о вашем VPN-соединении в «C: \ rasphone.pbk» в соответствии с вашим примером и передать имя записи в вашу структуру в поле szEntryName.

LPCTSTR entryName = "Your Entry Name\0";
rdParams.szEntryName = entryName;

Надеюсь, это поможет!

person Jeff Winn    schedule 10.07.2012