Главная страница

Программирование в сетях Windows. Э. Джонс, Д. Оланд


Скачать 2.88 Mb.
НазваниеЭ. Джонс, Д. Оланд
АнкорПрограммирование в сетях Windows.pdf
Дата12.10.2017
Размер2.88 Mb.
Формат файлаpdf
Имя файлаПрограммирование в сетях Windows.pdf
ТипКнига
#9346
страница42 из 50
1   ...   38   39   40   41   42   43   44   45   ...   50
ГЛАВА 16 Клиент службы RAS
507
Листинг 16-1. (продолжение)
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
hRasConn = NULL;
// Если записать в этом поле пустую строку, RasDial будет
// использовать стандартные свойства установки связи.
lstrcpy(RasDialParams.szEntryName, " " ) ;
lstrcpy(RasDialParams.szPhoneNumber, "867-5309");
lstrcpy(RasDialParams.szUserName, "jenny");
1strcpy(RasDialParams.szPassword, "mypassword");
lstrcpy(RasDialParams.szDomain, "mydomain");
// Вызов RasDial в синхронном режиме
// (пятый параметр равен NULL)
Ret = RasDial(NULL, NULL, &RasDialParams, 0, NULL, ihRasConn);
if (Ret != 0)
printf("RasDial failed: Error = Xd\n", Ret);
Асинхронный режим
Асинхронный вызов RasDial гораздо сложнее. Если параметр ipvNotifier
функции RasDial не равен NULL, то RasDial будет работать в асинхронном ре- жиме, то есть запросы выполняются сразу, и соединения продолжают уста- навливаться. Вызов RasDial в асинхронном режиме предпочтительнее для ус- тановления RAS-соединения, так как позволяет отслеживать ход подключе- ния. Параметр IpvNotifier может быть как указателем на функцию, вызывае- мую, когда RasDial выполняет подключение, так и описателем окна, получа- ющего уведомления о ходе выполнения через сообщения Windows. Пара- метр dwNotifierType функции RasDial определяет тип функции или описате- ля окна, переданного в IpvNotifier. Вы можете указывать в dwNotifierType для параметра IpvNotifier следующие значения:
Ш О — для управления событиями подключения RasDial будет использовать указатель на функцию RasDialFunc;
Ш 1 — для управления событиями подключения RasDial будет использовать указатель на функцию RasDialFunc 1;
Ш 2 — для управления событиями подключения RasDial будет использовать указатель на функцию RasDialFunc2;
Ш OxFFFFFFFF RasDial должна отправить оконное сообщение в ходе под- ключения.
Иными словами, есть три прототипа функций, которые вы можете пере- давать в параметр IpvNotifier функции RasDial для получения обратных уве-

508
ЧАСТЬ III Служба удаленного доступа (RAS)
домлений о событиях подключения RasDialFunc, RasDialFund и RasDial-
Func2 Первый — RasDialFunc, описан так
VOID WINAPI RasDialFunc(
UINT unMsg,
RASCONNSTATE rasconnstate,
DWORD dwError
В параметр unMsg передается тип произошедшего события На данный момент таким событием может быть только WM_RASDIALEVENT, а значит, этот параметр бесполезен В параметр rasconnstate передается активность под- ключения, которая будет начата функцией RasDial Табл 16-1 описывает воз- можные действия подключения Если одно из них не выполняется, в пара- метр dwError передается код ошибки RAS
Табл. 16-1. Действия подключения RAS
Состояние
Действие
Описание
Выполнение RASCSOpenPort
RASCS_PortOpened
RASCS_ConnectDevice
RASCSJDevweConnected
RASCS_AUDevices-
Connected
RASCS_Authenticate
RASCS_AuthNotiJy
RASCS_AuthRetry
RASCS_AuthCallback
RASCS_AuthChange-
Password
RASCS_AuthProject
RASCS_AuthLmkSpeed
RASCS_AuthAck
RASCS_ReAuthenticate
RASCS_Authenticated
RASCS PrepareFor-
Callback
RASCS_WmtFor-
ModemReset
RASCS_ WaitForCallback
RASCS_Projected
RASCS_StartAuthen-
tication
Коммуникационный порт готовится к открытию
Коммуникационный порт открыт
Устройство готово к подключению
Устройство успешно подключено
Установлен физический канал передачи данных
Процесс аутентификации RAS начат
Произошло событие аутентификации
Клиент сделал запрос на новую попытку аутентификации
Сервер запросил номер обратного вызова
Клиент сделал запрос на изменение пароля в учетной записи
Проекция протокола начата
Вычисляется скорость соединения
Запрос на аутентификацию подтверждается
Процесс аутентификации будет начат после обратного вызова
Клиент успешно завершил аутентификацию
Линия готова к отключению для подготов- ки к обратному вызову
Клиент ожидает перезагрузки модема для подготовки к обратному вызову
Клиент ожидает входящего звонка от сервера
Проекция протокола завершена
Аутентификация пользователя начинается или повторяется (только для Windows 9x)

ГЛАВА 16 Клиент службы RAS
509
Табл. 16-1.
(продолжение)
Состояние
Действие
Описание
Пауза
Завершение
RASCS_CallbackComplete
RASCS_LogonNetwork
RASCSJubEntry-
Connected
RASCSJubEntryDts-
connected
RASCS_RetryAuthen-
tication
RASCS_CallbackSetBy-
Caller
RASCSJPasswordExpired
RASCSJnvokeEapUI
RASCSjConnected
RASCS Disconnected
До клиента был произведен обратный вызов (только для Windows 9x)
Клиент подключается к удаленной сети
(только для Windows 9x)
Подключена подзапись многоканальной записи телефонного справочника Пара метр dwSubEntry функции RasDiaWunc2
получает значение индекса подсоединен ной подзаписи
Подзапись записи многоканального теле фонного справочника отключилась Пара- метр dwSubEntry функции RasDialFunc2
получает значение индекса отсоединен- ной подзаписи
RasDial в режиме ожидания учетных рек- визитов нового пользователя
RasDial ожидает от клиента номера обратного вызова
RasDial ожидает от пользователя задания нового пароля
В Windows 2000 RasDial ожидает, пока специальный пользовательский интер- фейс получит ЕАР-информацию
RAS-соединение успешно установлено и активно
RAS-соединение установить не удалось или оно неактивно
Как видно из табл 16-1, существуют три режима работы, ассоциируемые с действиями подключения при асинхронном вызове RasDial выполнение,
пауза и завершение Выполнение означает, что RasDial в процессе работы,
и каждый процесс предлагает информацию о ходе работы
Пауза означает, что RasDial требуется дополнительная информация для установления соединения По умолчанию режим паузы отключен Вы можете включить его, задав флаг RDEOPT_PausedStates в структуре RASDIALEXTENSIONS
Когда система в режиме паузы, это может означать, что пользователь должен
Ш ввести новые учетные реквизиты, так как аутентификация не удалась,
Ш. ввести новый пароль, так как текущий устарел,
Ш ввести номер обратного вызова
Эти параметры активности относятся к информации в структуре RASDIAL-
PARAMS, описанной ранее Когда возникнет пауза, RasDial уведомит об этом клиентскую функцию обратного вызова (или оконную процедуру) Если ре- жим паузы отключен, то RAS отправит ошибку в клиентскую функцию уве- домления, и RasDial даст сбой, если включен — RasDial останется в режиме,

5 1 0 ЧАСТЬ III Служба удаленного доступа (RAS)
позволяющем приложению вводить новую информацию через структуру
RASDIALPARAMS. Когда RasDial в режиме паузы, вы можете возобновить ее работу, вызвав ее заново с описателем соединения исходного вызова QphRas-
Conri) и функцией уведомления (ipvNotifier). Или просто завершите работу в режиме паузы, вызвав RasHangUp (описана далее в этой главе). Если вы во- зобновляете приостановленное соединение, то задайте входные данные пользователя через структуру RASDIALPARAMS, переданную в функцию RasDial
при возобновляемом вызове.
ПРИМЕЧАНИЕ Не возобновляйте работу RasDial путем вызова ее пря- мо из функции обработчика уведомления (например, RasDialFunc).
RasDial разработана так, что не поддерживает данную ситуацию, так что лучше возобновить работу RasDial прямо из потока приложения.
Последний режим — завершение, свидетельствует, либо что соединение ус- пешно установлено, либо что его установить не удалось, либо что функция
RasHangUp закрыла соединение.
Теперь продемонстрируем простую программу, асинхронно вызываю- щую RasDial (листинг 16-2). Пример асинхронного вызова RasDial вы также найдете на прилагаемом компакт-диске.
Листинг 16-2. Асинхронный вызов RasDial
void main(void)
{
DWORD Ret;
RASDIALPARAMS RasDialParams;
HRASCONN hRasConn; . щ
£
//
Задайте в структуре RASDIALPARAMS параметры вызова,
// как это было сделано в примере синхронного вызова
И*.
if ((Ret = RasDial(NULL, NULL, &RasDialParams, 0, P
&RasDialFunc, &hRasConn)) != 0) kP.
{ SH
printf("RasDial f a i l e d with error Xd\n", Ret);
return; .»,,,
// Выполните другие задачи, пока работает RasDial
// Функция обратного вызова RasDialFunc()
void WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate,
DWORD dwError) "-.
{
char szRasString[256]; // Буфер для строки с ошибкой i f (dwError)

Г Л А В А 16 Клиент службы RAS 511
Листинг 16-2. {продолжение)
{
RasGetErrorString((UINT)dwError, szRasString, 256);
printf("Error: Xd - Xs\n",dwError, szRasString);
return;
// Привязка каждого из режимов RasDial и вывод на экран
// сведений о состоянии, в которое переходит RasDial
л
switch (rasconnstate)
•к case RASCS_ConnectDevice:
-d^
1
printf ("Connecting device.. ,\n");
.<\\< break;
ф case RASCS_DeviceConnected:
.^ printf ("Device connected.\n");
j, break;
* // Здесь можно добавить другие действия подключения
-Он
-1^, default:
printf ("Unmonitored RAS activity.\n");
break;
Ранее мы также упоминали о других функциях обратного вызова для уве- домления — RasDialFuncl и RasDialFunc2:
VOID WINAPI RasDialFuncK
HRASCONN hrasconn,
UINT unMsg,
RASCONNSTATE rases,
DWORD dwError,
DWORD dwExtendedError
DWORD WINAPI RasDialFunc2(
DWORD dwCallbackld,
DWORD dwSubEntry,
HRASCONN hrasconn,
UINT unMsg,
RASCONNSTATE rases,
DWORD dwError,
DWORD dwExtendedError
);
Функция RasDialFuncl похожа на RasDialFunc, рассмотренную ранее.
Отличие в том, что у RasDialFuncl два дополнительных параметра: hrasconn

5 1 2 ЧАСТЬ III Служба удаленного доступа (RAS)
и dwExtendedError. Параметр hrasconn — это описатель возвращаемого Ras-
Dial соединения. Параметр dwExtendedError позволяет получить расширен- ную информацию об ошибке. Иногда во время подключения происходят следующие типы ошибок:
ERROR SERVERNOTRESPONDING или ERROR NETBIOSERROR
dwExtendedError получает код ошибки, определенной NetBIOS;
Ш ERRORAUTHINTERNAL — dwExtendedError получает код ошибки внут- ренней диагностики (эти коды не документированы);
В ERRORCANNOTGETIANA — dwExtendedError получает код ошибки,
определяемой маршрутизируемой RAS.
Функция RasDialFunc2 аналогична RasDialFuncl, но у нее еще два пара- метра: dwCallbackld и dwSubEntry. Параметр divCallbackld содержит опреде- ляемое приложением значение, которое первоначально было в поле dw-
Callbackld структуры RASDIALPARAMS, переданной в вызов RasDial. В параметр
dwSubEntry передается индекс подзаписи телефонного справочника, по ко- торому RasDialFunc2 осуществила обратный вызов.
Уведомление о состоянии
RAS использует автономную функцию RasConnectionNotification, позволяю- щую приложению прекращать работу во время создания или закрытия асин- хронного RAS-соединения:
DWORD RasConnectionNotification(
HRASCONN hrasconn, {
HANDLE hEvent,
DWORD dwFlags '
);
Параметр hrasconn — это описатель соединения, возвращенный RasDial.
Параметр hEvent — описатель события, который создается приложением с использованием функции CreateEvent. Значением параметра dwFlags может быть комбинация следующих флагов действий подключения:
Ш RASCN_Connection — уведомляет о создании RAS-соединения; если па- раметр hrasconn равен INVALID_HANDLE_VALUE, событие освобождается при каждом RAS-соединении;
Ш RASCN_Disconnection уведомляет о завершении RAS-соединения; если параметр hrasconn равен INVALID_HANDLE_VALUE, событие освобождает- ся при каждом завершении RAS-соединения;
В RASCNBandwidthAdded при многоканальном соединении событие освобождается, когда подсоединяется подзапись;
Ш RASCN BandwidthRemoved — при многоканальном соединении собы- тие освобождается, когда отсоединяется подзапись.
Заметьте, что эти флаги функционируют аналогично флагам действий подключения (табл 16-1). Если какие-то из событий происходят во время подключения, событие будет помечено как свободное (signaled). Затем, что-

ГЛАВА 16 Клиент службы RAS 513
бы узнать об освобождении объекта, приложение должно использовать
Win32-4)yHKUHH ожидания, типа WaitForSingleObject
Завершение соединения
Завершить установленное соединение с помощью RasDial просто. Нужно лишь вызвать функцию RasHangUp:
DWORD RasHangUp(
HRASCONN hrasconn
Параметр hrasconn — это описатель, возвращаемый RasDial. Функция про- ста, но при ее использовании все же нужно учитывать внутреннюю органи- зацию соединения в RAS. Соединение использует модемный порт, и порту требуется время для внутреннего возврата в исходное состояние, когда со- единение закрывается. Так что нужно подождать окончательного закрытия соединения через порт. Чтобы узнать состояние сброшенного соединения,
вызовите RasGetConnectionStatus:
DWORD RasGetConnectStatus(
HRASCONN hrasconn,
LPRASCONNSTATUS lprasconnstatus
);
Параметр hrasconn — это описатель, возвращаемый RasDial. Параметр
lprasconnstatus — структура RASCONNSTATUS, получающая состояние текуще- го соединения:
typedef struct .RASCONNSTATUS
{
DWORD dwSize;
RASCONNSTATE rasconnstate;
DWORD dwError;
TCHAR szDeviceType[RAS_MaxDeviceType + 1];
TCHAR szDeviceName[RAS_MaxDeviceName + 1];
} RASCONNSTATUS;
Перечисленные в отрывке кода поля определены следующим образом:
Ш dwSize размер (в байтах) структуры RASCONNSTATUS;
Ш rasconnstate — один из параметров активности подключения (табл. 16-1);
Ш dwError — конкретный код ошибки RAS, если RasGetConnectStatus не воз- вращает 0;
Ш szDeviceType тип устройства, используемого при соединении.
Ш szDeviceName — имя текущего устройства.
Рекомендуется проверять состояние соединения, пока не будет получено значение RASCS_Disconnected. Очевидно, придется несколько раз вызывать
RasGetConnectionStatus, прежде чем соединение закроется. Затем можете вый- ти из приложения или установить новое соединение.

514 ЧАСТЬ III Служба удаленного доступа (RAS)
Телефонный справочник
RAS может устанавливать соединение с удаленным сервером, используя за- писи телефонного справочника для хранения и организации свойств Теле- фонный справочник — это совокупность структур RASENTRY, в которых со- держатся телефонные номера, скорость передачи данных, информация для аутентификации пользователя и др В Windows 95, 98 и СЕ телефонный спра- вочник хранится в системном реестре, в Windows 2000 и NT — в файлах,
обычно имеющих расширение pbk Структура RASENTRY определена так typedef struct tagRASENTRY
{
DWORD dwSize, f-»
DWORD dwfOptions, Ikt.
DWORD dwCountrylD, iqi
DWORD dwCountryCode, цд >
TCHAR szAreaCode[RAS_MaxAreaCode + 1], ,
O )
TCHAR szLocalPhoneNumber[RAS_HaxPhoneNumber + 1],
ш
DWORD dwAlternateOffset,
RASIPADDR lpaddr,
RASIPADDR lpaddrDns,
RASIPADDR lpaddrDnsAlt,
RASIPADDR lpaddrWins, .(
RASIPADDR lpaddrWinsAlt,
DWORD
DWORD
DWORD
TCHAR
TCHAR
TCHAR
TCHAR
TCHAR
TCHAR
TCHAR
TCHAR
TCHAR
DWORD
DWORD
DWORD
#if (WINVER
DWORD
DWORD
DWORD
DWORD
DWORD
DWORD
DWORD
#endlf
#if (WINVER
dwFrameSize,
dwfNetProtocols,
dwFramingProtocol szScript[MAX_PATH],
szAutodialDll[MAX_PATH],
8zAutodialFuno[MAX_PATH],
szDeviceType[RAS_MaxDeviceType szDeviceName[RAS_MaxDevioeName szX25PadType[RAS_MaxPadType +
szX25Address[RAS_MaxX25Addres3
h
гОТШЮШМЯ.
+ 1],
+ 1],
1],
+ 1],
szX25Facilities[RAS_MaxFaoilities + 1],
szX25UserData[RAS_MaxUserData dwChannels,
dwReservedi,
dwReserved2,
>= 0x401)
dwSubEntries,
dwDialMode,
dwDialExtraPercent,
dwDlalExtraSampleSeconds,
dwHangllpExtraPercent,
dwHangUpExtraSampleSeconds,
dwIdleDisconnectSeconds,
>= 0x500)
+ 1].

ГЛАВА 16 Клиент службы RAS 515
DWORD dwType,
DWORD dwEncryptionType,
DWORD dwCustomAuthKey,
GUID guidld
TCHAR szCustomDialDll[MAX_PATH],
DWORD dwVpnStrategy,
#endif
> RASENTRY,
Ниже перечислены поля этой структуры
Ш dwSize — определяет размер (в байтах) структуры RASENTRY
Ш dwfOptions — может иметь значение одного или нескольких необяза- тельных флагов
RASEO_Custom — применяется пользовательское шифрование (в Win- dows 2000),
Ш RASEO_DisableLcpExtensions — RAS отключает определенные в RFC 1570
расширения РРР LCP,
Ш RASEOJpHeaderCompression — RAS согласует сжатие заголовка IP через
РРР-соединение,
RASEOJAodemLights — в Windows 2000 панель задач отобразит мони- тор состояния,
Ш RASEOJVetworkLogon — в Windows 9x RAS попытается подключить пользователя к домену только после аутентификации RAS-соединения,
Ш RASEOJPreviewDomam — в Windows 2000 RAS отобразит домен пользо- вателя до вызова,
В RASEO_PrevwwPhoneNumber — в Windows 2000 RAS отобразит теле- фонный номер для вызова,
Ш RASEO_PromoteAlternates — RAS может сделать главным дополнитель- ный номер, если по нему успешно устанавливается соединение,
Я RASEO\_RemoteDefaultGateway — когда активно RAS-соединение, марш- рут для IP-пакетов по умолчанию предпочтительнее устанавливается через адаптер удаленной связи, а не через другой сетевой адаптер,
RASEO_RequireCHAP — в Windows 2000 для аутентификации будет исполь- зован протокол Challenge Handshake Authentication Protocol (CHAP),
Ш RASEO_RequireDataEncryphon — шифрование данных должно быть ус- пешно согласовано, иначе соединение следует разорвать, при этом также следует включить флаг RASEO_RequireEncryptedPw,
Ш RASEO JZequireEAP — в Windows 2000 для аутентификации будет ис- пользован ЕАР,
Ш RASEO_ReqmreEncryptedPw — не позволяет РРР использовать протокол
Password Authentication Protocol (PAP) для аутентификации клиента,
вместо этого применяются протоколы CHAP и Shiva's Password Aut- hentication Protocol (SPAP),

516 ЧАСТЬ III Служба удаленного доступа (RAS)
Я RASEO_RequireMsCHAP — в Windows 2000 для аутентификации будет использован протокол Microsoft CHAP;
RASEO_RequireMsCHAP2 — в Windows 2000 для аутентификации будет использован протокол Microsoft CHAP версии 2;
RASEO_RequireMsEncryptedPw — перекрывает RASEO_RequireEncryptedPw
и позволяет RAS использовать схемы защиты паролем, такие как Mic+
rosoft CHAP;
II RASEOJRequirePAP — в Windows 2000 для аутентификации будет ис- пользован протокол РАР;
Я RASEO_RequireSPAP — в Windows 2000 для аутентификации будет ис- пользован протокол SPAP;
Ш RASEO_RequireW95MSCHAP — в Windows 2000 для аутентификации бу- дет использована старая версия протокола Microsoft SPAP (разработан- ная для RAS-сервера Windows 95);
Ш RASEO_ReviewUserPW — в Windows 2000 RAS отобразит имя пользова- теля и его пароль до вызова;
RASEO_SecureLocalFiles — в Windows 2000 и Windows NT RAS проверит существование удаленной файловой системы и привязки удаленных принтеров до установления соединения;
RASEO_SharedPhoneNumbers — в Windows 2000 телефонные номера будут использоваться совместно;
RASEOjShowDialingProgress — в Windows 2000 RAS отобразит ход вызова;
RASEO_SpecificIpAddr — RAS будет использовать IP-адрес, определенный в поле ipaddr,
Ш RASEO_SpecificNameServers — RAS будет использовать информацию IP, оп- ределенную в полях ipaddrDns, ipaddrDnsAlt, ipaddrWins, и ipaddrWinsAlt;
Ш RASEOjSwCompression — позволяет RAS согласовывать программное сжатие данных, передаваемых через соединение;
RASEO_TerminalAfterDial — RAS отобразит окно терминала для ввода ин- формации пользователем после установления соединения;
RASEO_TerminalBeforeDial — RAS отобразит окно терминала для ввода информации пользователем до установления соединения;
Ш RASEOJJseCountryAndAreaCodes — RAS будет использовать поля dw-
CountrylD, dwCountryCode и szAreaCode для создания телефонного но- мера с помощью поля szLocalPhoneNumber,
Ж RASEOJJseLogonCredentials — RAS будет использовать имя, пароль и до- мен пользователя, подключившегося во время вызова, но только если включен флаг RASEO_RequireMsEncryptedPw.
dwCountrylD — определяет TAPI-идентификатор страны, если включен необязательный флаг RASEOJJseCountryAndAreaCodes. Информацию об идентификаторе страны можно получить, вызвав функцию RasGetCount-
rylnfo.

Г Л А В А 16 Клиент службы RAS 517
Ш dwCountryCode определяет код страны, связанный с полем dwCount-
rylD в случае, если включен необязательный флаг RASEOJJseCountryAnd-
AreaCodes. Если это поле равно 0, используется код страны, связанный с
dwCountrylD.
Ш szAreaCode — определяет код зоны, если включен флаг RASEOJJseCount-
ryAndAreaCodes.
Ш szLocalPhoneNumber — определяет телефонный номер для вызова. Если включен флаг RASEOJJseCountryAndAreaCodes, то RAS объединит поля
dwCountrylD, dwCountryCode и szAreaCode с вашим телефонным номером.
dwAlternateOffset определяет смещение в байтах от начала этой струк- туры до места, где хранятся дополнительные телефонные номера для за- писи телефонного справочника. Дополнительные номера хранятся в виде
щ последовательности строк, завершающихся символом /0. Последняя стро- ка в наборе заканчивается двумя последовательными символами /0.
Ш ipaddr определяет IP-адрес для этого соединения, если включен флаг
RASEO_SpecifidpAdd.
Ш ipaddrDns определяет IP-адрес DNS-сервера для этого соединения,
если включен флаг RASEO_SpecificNameServers.
Ш ipaddrDnsAlt — определяет IP-адрес вспомогательного DNS-сервера для этого соединения, если включен флаг RASEO_SpecificNameServers.
Ш ipaddrWins — определяет IP-адрес WINS-сервера для этого соединения,
если включен флаг RASEOJSpecificNameServers.
Ш ipaddrWinsAlt определяет IP-адрес вспомогательного WINS-сервера для этого соединения, если включен флаг RASEO_SpecificNameServers.
Ш dwFrameSize — изменяет размер кадра протокола на 1006 или 1500 байт,
если в поле dwFramingProtocol задан флаг RASFP_Slip.
Ш dwfNetProtocols — определяет флаги, идентифицирующие, какие сете- вые протоколы будут использоваться поверх кадрирующего: RASNP_Net-
BEUI — для NetBEUI, RASNPJpx — для IPX, для RASNPJp — для IP.
dwFramingProtocol определяет флаги, идентифицирующие, какой кадрирующий протокол будет использоваться для RAS-соединения: RAS-
FPJPpp — для РРР, RASFPSlip — для SLIP, RASFP_Ras — для асинхронного
NetBEUI.
szScript — определяет полный путь к сценарию удаленного подключения,
который выполняется при установке соединения.
И szAutodialDll определяет настраиваемую DLL, которая может быть использована для автоматического вызова (с автонабором номера).
Ш zAutodialFunc определяет имя функции, экспортируемое из запро- шенной DLL в поле szAutodialDll.
Ш szDeviceType определяет тип устройства, используемого для установ- ки соединения. Значение должно идентифицироваться как строка:
• «RASDT_Modem» — модем на СОМ-порте;

51 8 ЧАСТЬ III Служба удаленного доступа (RAS)
Ж «RASDTJsdn» — адаптер ISDN; » »
Ш «RASDT_X25» — плата Х.25;
Я «RASDT_Vpn» — соединение через виртуальную частную сеть (VPN); *
Ж «RASDT Pad» — сборщик (разборщик) пакетов;
Щ
Ш «RASDT_Generic» — базовый тип;
• «RASDT Serial» — последовательный порт; . е»
• «RASDT_FrameRelay» — устройство ретрансляции кадров; ц
и
^.
И «RASDT_Atm»—устройство ATM;
v
»
• «RASDT_Sonet» — устройство синхронной оптической сети (SONET);"'
Ш «RASDT_SW56» — коммутируемый доступ на скорости 56 кбит/с;
• «RASDTIrda» — ИК-устройство;
И «RASDT_Parallel» — параллельный порт.
И szDeviceName идентифицирует устройство TAPI, используемое для соединения. Вы можете запрашивать информацию об этих устройствах,
используя функцию RasEnumDevices.
Ш szX25PadType — определяет тип Х.25 PAD.
szX25Address — определяет адрес Х.25. .
szX25Facilities — определяет средства для запроса с узла Х.25.
Ш szX25UserData — определяет дополнительную информацию для соеди- нения Х.25.
dwChannels — не используется.
dwReservedl не используется, должен иметь значение 0.
dwReserved2 — не используется, должен иметь значение 0.
Ш dwSubEntries показывает, сколько многоканальных подзаписей ассо- циируется с данной записью телефонного справочника. Нужно присво- ить этому полю значение 0 и передать организацию многоканальных подзаписей для него функции RasSetSubEntryProperties (подробно будет описана далее в этой главе).
dwDialMode в Windows 2000 определяет, как RAS должна вызывать многоканальные подзаписи, когда соединение происходит с помощью
RASEDMjDialAll и RASEDMJDialAsNeeded. Если это поле равно RASEDMjDial-
All, то RAS вызывает все многоканальные подзаписи, а если RASEDMJDial-
AsNeeded — использует поля dwDialExtraPercent, dwDialExtraSampleSe-
conds, dwHangUpExtraPercent и dwHangUpExtraSampleSeconds для опреде- ления, когда дополнительные многоканальные подзаписи следует вызы- вать и отключать.
dwDialExtraPercent в Windows 2000 определяет процент общей те- кущей пропускной способности соединения. RAS вызывает дополнитель- ную подзапись, когда суммарная занятая пропускная способность превы- шает это значение, минимум на dwDialExtraSampleSeconds.

Г Л А В А 16 Клиент службы RAS 519
dwDialExtraSampleSeconds — в Windows 2000 определяет количество секунд, на которое может быть превышено процентное использование пропускной способности согласно dwDialExtraPercent до того, как будет вызвана дополнительная подзапись.
dwHangUpExtraPercent — в Windows 2000 определяет процентное от-
"' ношение трафика доступных подзаписей от общей пропускной способ-
01
ности. RAS завершит соединения, связанные с подзаписями, когда данный х
показатель станет ниже этого значения на время dwHangUpExtraSample-
** Seconds.
dwHangUpExtraSampleSeconds в Windows 2000 определяет количе-
* ство секунд, на которое должно упасть процентное использование про-
^ пускной способности согласно dwHangUpExtraPercent до того, как будет
7 отключена дополнительная подзапись.
Ш dwIdleDisconnectSeconds — определяет, сколько секунд разрешается
., простаивать соединению до его завершения. Также вы можете присвоить
_' этому полю RASIDS_Disabled, чтобы предотвратить разрыв соединения, и
Jj RASlDSJJseGlobaWalue, чтобы использовать системное значение по умол- w
чанию.
Щ dwType — в Windows 2000 определяет тип записи телефонного справоч-
' ника:
Ш RASET_Direct — прямое последовательное или параллельное соединение.
RASETJnternet — службы соединений с Интернетом (Internet connec- tion services, ICS);
RASETPhone — телефонная линия;
Ш RASETVpn — виртуальная частная сеть.
Ш dwEncryptionType в Windows 2000 определяет тип шифрования дан- ных, передаваемых через соединение:
ET_40Bit — 40-битное шифрование данных;
ET_128Bit — 128-битное шифрование данных.
dwCustomAuthKey — в Windows 2000 определяет ключ аутентификации,
предоставляемый поставщику ЕАР.
И guidld в Windows 2000 идентифицирует глобально-уникальный иден- тификатор GUID, ассоциируемый с записью телефонного справочника.
szCustomDialDll — в Windows 2000 определяет путь к DLL, содержащей специальные функции устройства вызова RAS. Если это поле равно NULL,
то RAS будет использовать стандартное устройство вызова. На подробно- стях разработки собственного устройства вызова RAS мы останавливаться не будем.
dwVpnStrategy в Windows 2000 определяет стратегию вызова VPN:
Ш VSJDefault — сначала RAS вызывает протокол Point-to-Point Tunneling
Protocol (РРТР), а если РРТР дает сбой — протокол Layer 2 Tunneling
Protocol (L2TP);

5 2 0 ЧАСТЬ III Служба удаленного доступа (RAS)
Ш VS_L2tpFirst — сначала RAS вызывает L2TP; -л »
VS_L2tpOnly — RAS вызывает только L2TP;
п
Ш VS_PptpFirst — сначала RAS вызывает РРТР;
VS_PptpOnly — RAS вызывает только РРТР;
Когда вы вызываете любую API-функцию RAS, в которой файл телефон- ного справочника является параметром (lpszPhonebook), то можете задать путь к файлу телефонного справочника. Как уже упоминалось, в Windows 9x и СЕ этот параметр должен иметь значение NULL, так как записи телефон- ного справочника хранятся в системном реестре. В Windows 2000 и NT этот параметр может содержать путь к файлу телефонного справочника. В общем случае файл телефонного справочника будет иметь расширение .pbk, а имя стандартного системного справочника — %SystemRoot%\System32\Ras\ Ras-
Phone.pbk. Если указать значение NULL, то используется системный телефон- ный справочник.
Для создания и организации записей телефонного справочника преду- смотрены три вспомогательных функции: RasValidateEnttyName, RasEnum-
Devices и RasGetCountrylnfo. Функция RasValidateEnttyName определяет, пра- вильно ли имя отформатировано и существует ли оно уже в телефонном справочнике:
DWORD RasValidateEntryName(
LPCTSTR lpszPhonebook,
LPCTSTR lpszEntry
);
Параметр lpszPhonebook — указатель на имя файла телефонного справоч- ника. Параметр lpszEntry — строка, представляющая собой имя проверяемой записи. Если имени в справочнике нет и оно отформатировано должным образом, эта функция возвращает ERROR_SUCCESS. Иначе функция дает сбой:
с ошибкой ERROR_INVALIDJSfAME — если имя правильно не отформатирова- но, и с ошибкой ERROR_ALREADY_EXISTS — если имя уже содержится в спра- вочнике.
Функция RasEnumDevices получает имя и тип всех совместимых с RAS ус- тройств, доступных на компьютере:
DWORD RasEnumDevices( •>
LPRASDEVINFO lpRasDevInfo,
LPDWORD lpcb,
LPDWORD lpcDevices
);
Параметр lpRasDevInfo — указатель на буфер приложения, который нужен
для получения массива структур RASDEVINFO:
typedef struct tagRASDEVINFO { I
DWORD dwSize;
TCHAR szDeviceType[RAS_MaxDeviceType + 1];
TCHAR szDeviceNaine[RAS_MaxDeviceName + 1];
} RASDEVINFOW;

Г Л А В А 16 Клиент службы RAS 521
Поля этой структуры определяются следующим образом:
dwSize размер (в байтах) структуры RASDEVINFO до вызова RasEnum-
Devices;
Ш szDeviceType — строка, описывающая тип устройства, например
«RASDT_Modem»;
Ш szDeviceName — формальное имя TAPI-устройства.
Очень важно, чтобы буфер был достаточно большим для записи нескольких структур, иначе RasEnumDevices вернет ошибку ERROR_BUFFER_ ТОО SMALL.
Следующий параметр — Ipcb, указатель на переменную, получающую коли- чество байт, требующихся для перечисления устройств. Ему нужно присво- ить размер (в байтах) вашего ipRasDevInfo буфера. Последний параметр —
ipcDevices, указатель на переменную, получающую число структур RASDE-
VINFO, записанных в IpRasDevInfo.
Функция RasGetCountrylnfo позволяет получать из Windows специальную информацию о стране для TAPI-вызова:
DWORD RasGetCountryInfo(
LPRASCTRYINFO lpRasCtrylnfo,
LPDWORD lpdwSize
);
Параметр lpRasCtrylnfo — буфер, получающий префикс телефонного но- мера и другую информацию, ассоциируемую с определенной страной. Этот буфер должен содержать структуру RASCTRY1NFO, за которой следуют допол- нительные байты, получающие строку с описанием страны. Для хранения структуры RASCTRYINFO и строки описания рекомендуется выделить мини- мум 256-байтный буфер. Структура RASCTRYINFO определена так:
typedef struct RASCTRYINFO
{
DWORD dwSize;
DWORD dwCountrylD;
DWORD dwNextCountrylD;
DWORD dwCountryCode;
DWORD dwCountryNameOffset;
} RASCTRYINFO;
Ее поля описаны следующим образом:
Ш dwSize размер (в байтах) структуры RASCTRYINFO;
Ш dwCountrylD — TAPI-идентификатор страны (относящийся к полю dw-
CountrylD структуры RASENTRY) в определенном в Windows перечне стран;
если его значение равно 1, то будет использована первая запись переч- ня, и т. д.;
dwNextCountrylD следующий TAPI-идентификатор страны в списке;
если это поле получает значение О, то вы уже в конце списка;
dwCountryCode — префикс телефонного номера представляет собой код, ассоциируемый со страной, определенной в параметре dwCountrylD,

522 ЧАСТЬ III Служба удаленного доступа (RAS)
Ш dwCountryNameOffset сколько байт от начала данной структуры до начала следующей, завершающейся символом /0 строки с описанием страны
Другой параметр RasGetCountrylnfo — ipdwSize, указывает на переменную,
получающую количество байт, которое RasGetCountrylnfo помещает в буфер
ipRasCtrylnfo Перед вызовом функции присвойте этому параметру значение,
определяющее размер буфера приложения
Добавление записей в телефонный справочник
Программно организовать структуры RASENTRY телефонного справочника позволяют четыре функции RasSetEntryProperties, RasGetEntryProperties, Ras-
RenameEntry и RasDeleteEntry Для создания новой или модификации суще- ствующей записи используется функция RasSetEntryProperties
DWORD RasSetEntryProperties(
LPCTSTR lpszPhonebook,
LPCTSTR lpszEntry,
LPRASENTRY lpRasEntry,
DWORD dwEntrylnfoSize,
LPBYTE lpbDevicelnfo,
DWORD dwDevicelnfoSize
);
Параметр lpszPhonebook — указатель на имя файла телефонного справоч- ника Параметр lpszEntry — указатель на строку, используемую для иденти- фикации существующей или новой записи Если структура RASENTRY с таким именем существует, свойства модифицируются, если нет— в телефонном справочнике создается новая запись Параметр lpRasEntry указывает на струк- туру RASENTRY Для определения дополнительных телефонных номеров вы можете поместить после структуры RASENTRY список строк, завершающих- ся символом /0 Последняя строка завершается двумя последовательными сим- волами /О Параметр dwEntrylnfoSize содержит размер (в байтах) структуры,
указанной в параметре lpRasEntry Параметр lpbDevicelnfo — указатель на бу- фер с информацией о конфигурации TAPI-устройства В Windows 2000 и NT
этот параметр не используется и должен иметь значение NULL Последний параметр — dwDevicelnfoSize, содержит размер (в байтах) буфера lpbDevicelnfo
Функция RasGetEntryProperties может быть использована для получения свойств существующей записи телефонного справочника или значений по умолчанию новой
DWORD RasGetEntryProperties(
LPCTSTR lpszPhonebook,
LPCTSTR lpszEntry,
LPRASENTRY lpRasEntry,
LPDWORD lpdwEntrylnfoSize,
LPBYTE lpbDevicelnfo,
LPDWORD lpdwDevicelnfoSize

Г Л А В А 16 Клиент службы RAS 523
Параметр ipszPhonebook указывает нз имя файла телефонного справоч- ника, параметр ipszEntry — на строку, идентифицирующую существующую запись справочника Если присвоить этому параметру значение NULL, то параметры IpRasEntry и ipbDevicelnfo получат стандартные значения записи телефонного справочника Это полезно когда будет нужно создать новую запись, вы сможете заполнить поля IpRasEntry и IpbDevicelnfo правильной информацией о системе перед вызовом функции RasSetEntryProperties
Параметр IpRasEntry — указатель на буфер, предос гавляемый приложени- ем для получения структуры RASENTRY Как мы уже упоминали, за этой струк- турой может следовать массив строк, завершающихся символом /0 Он оп- ределяет дополнительные телефонные номера для запрошенной записи те- лефонного справочника Следовательно, размер получающего буфера дол- жен быть больше структуры RASENTRY Если передать в этот параметр указа- тель NULL, то ipdwEntryLnfoSize получит общее количество байт, необходимых для хранения всех элементов структуры RASENTRY и дополнительных теле- фонных номеров
Параметр ipdwEntrylnfoSize — указатель на DWORD, содержащий количе- ство байт в получающем буфере, который приложение определило через параметр IpRasEntry Когда эта функция выполнится, она обновит IpdwEntry-
lnfoSize и запишет в него количество байт, реально полученных в IpRasEntry
Мы настоятельно рекомендуем вызывать эту функцию со значением пара- метра IpRasEntry, равным NULL, и значением параметра IpdwEntryLnfoSize, рав- ным 0, для получения информации о размере буфера Затем вы сможете выз- вать эту функцию снова и вывести всю информацию без ошибок
Параметр IpbDevicelnfo указывает на предоставленный приложением бу- фер, получающий специальную информацию о TAPI-устройстве для данной записи телефонного справочника Если этот параметр равен NULL, то Ipdw-
DevicelnfoSize получит число байт, необходимых для получения нужной ин- формации Если вы используете Windows 2000 и NT, то параметр IpbDe-
vicelnfo должен иметь значение NULL Последний параметр — ipdwDevice-
infoSize, указатель на DWORD, который должен иметь значение количества байт, содержащихся в буфере для IpbDevicelnfo При выполнении RasGet-
EntryProperties ipdwDevicelnfoSize возвратит количество байт, которые зано- сятся в буфер IpbDevicelnfo
Листинг 16-3 демонстрирует, как приложение должно использовать функции RasGetEntryProperties и RasSetEntryProperties для создания новой за- писи телефонного справочника
Листинг 16-3. Создание новой записи телефонного справочника RAS с использованием свойств, заданных по умолчанию
«include
«include
«include
«include
void main(void)
см. след. стр.

524 ЧАСТЬ III Служба удаленного доступа (RAS)
Листинг 16-3. {продолжение)
{
DWORD EntrylnfoSize = 0;
DWORD DevicelnfoSize = 0;
DWORD Ret;
LPRASENTRY lpRasEntry;
LPBYTE lpDevicelnfo;
// Получение информации о размере буфера
// для стандартной записи телефонного справочника
if ((Ret = RasGetEntryProperties(NULL, "", NULL,
&EntryInfoSize, NULL, &DeviceInfoSize)) != 0)
{
if (Ret != ERROR_BUFFER_TOO_SMALL)
{
printf("RasGetEntryProperties sizing failed
"with error Xd\n", Ret);
return;
lpRasEntry = (LPRASENTRY) GlobalAlloc(GPTR, EntrylnfoSize);
if (DevicelnfoSize == 0)
lpDevicelnfo = NULL;
else
lpDevicelnfo = (LPBYTE) GlobalAlloc(GPTR, DevicelnfoSize);
// Получение стандартной записи телефонного справочника
lpRasEntry->dwSize = sizeof(RASENTRY);
if ((Ret = RasGetEntryProperties(NULL, "", lpRasEntry,
&EntryInfoSize, lpDevicelnfo, &DeviceInfoSize)) != 0)
{
printf("RasGetEntryProperties failed with error Xd\n",
Ret);
return;
// Подтверждение нового имени телефонного справочника "Testentry"
if ((Ret = RasValldateEntryName(NULL, "Testentry")) !=
ERROR_SUCCESS)
{
printf("RasValidateEntryName failed with error Xd\n",
Ret);
return;

1   ...   38   39   40   41   42   43   44   45   ...   50


написать администратору сайта