Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям.
Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает...
Я вижу возможное решение так: На сервере стоит спец. программа которая по условному сигналу (из инета) переводит "входящие подключения" в режим "ответный вызов" клиенту, а на клиенте, другая спец. программа посылает усл. сигнал серверу и переводит клиента в режим ожидания ответного вызова...
В общем все тоже самое что и звонок клиента серверу с ответным вызовом, только вместо первого звонка клиента серверу клиент посылал бы сигнал серверу например через интернет.
Вот вопрос, как заставить сервер RAS перейти в режим перезвона клиенту, а клиента в режим ожидания?
И вообще, может есть более простое решение?
Здравствуйте, fsheet, Вы писали:
F>Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям. F>Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает...
В принципе, я думаю, если правильно настроить маршрутизацию, то всё должно работать. Покрайней мере, если бы это были UNIX'и я бы сделал за 5 минут
Под виндой тоже, я думаю проблем не должно быть.
Здравствуйте, fsheet, Вы писали:
F>Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям. F>Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает... F>Я вижу возможное решение так: На сервере стоит спец. программа которая по условному сигналу (из инета) переводит "входящие подключения" в режим "ответный вызов" клиенту, а на клиенте, другая спец. программа посылает усл. сигнал серверу и переводит клиента в режим ожидания ответного вызова... F>В общем все тоже самое что и звонок клиента серверу с ответным вызовом, только вместо первого звонка клиента серверу клиент посылал бы сигнал серверу например через интернет.
F>Вот вопрос, как заставить сервер RAS перейти в режим перезвона клиенту, а клиента в режим ожидания? F>И вообще, может есть более простое решение?
Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.
Здравствуйте, Protey, Вы писали:
P>Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.
В том-то и дело, что нельзя звонить! По этому и предпологается что клиент будет посылать сигнал серверу о звонке через интернет.
Здравствуйте, fsheet, Вы писали:
F>Здравствуйте, Protey, Вы писали:
P>>Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.
F>В том-то и дело, что нельзя звонить! По этому и предпологается что клиент будет посылать сигнал серверу о звонке через интернет.
Военная база что ли? Ж)
Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.
Здравствуйте, Protey, Вы писали:
P>Военная база что ли? Ж) P>Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.
А зачем открывать сокет? Ведь связи все-равно еще нету...
А вообще я и предпологал присать программу, только вот как (какими функциями с какими параметрами) перевести сервер в режим обратного звонка, а клиента в режим ожидания обратного звонка от сервера? Я смотрел в сторону RasDial() но ничего не высмотрел.
Здравствуйте, fsheet, Вы писали:
F>Здравствуйте, Protey, Вы писали:
P>>Военная база что ли? Ж) P>>Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.
F>А зачем открывать сокет? Ведь связи все-равно еще нету...
Дак это. А команду отзвонится клиенту программа получает телепатически? Я так понял, что через инет, а для этого нужен на тачке слушающий сокет. F>А вообще я и предпологал присать программу, только вот как (какими функциями с какими параметрами) перевести сервер в режим обратного звонка, а клиента в режим ожидания обратного звонка от сервера? Я смотрел в сторону RasDial() но ничего не высмотрел.
RasDial, только ещё надо сформировать запись в телефонной книжке + отлеживать уже установленное соединение.
Здравствуйте, Protey, Вы писали:
P>Здравствуйте, fsheet, Вы писали:
F>>А зачем открывать сокет? Ведь связи все-равно еще нету... P>Дак это. А команду отзвонится клиенту программа получает телепатически? Я так понял, что через инет, а для этого нужен на тачке слушающий сокет.
Ну не обязательно слушающий, можно просто регулярно проверять почтовый ящик. Но этой части у меня проблем нет, тем более что для начала в качестве события можно рассматриваться запуск программы
P>RasDial, только ещё надо сформировать запись в телефонной книжке + отлеживать уже установленное соединение.
В телефонной книжке у клиента уже есть соответствующая запись, предположим с названием "Server". И вот вопрос, как
"активировать" эту запись в режим ожидания обратного звонка с сервера? Очень хотелось бы увидеть примерный код (C,C++,C#,VBA,VB.NET, на чем угодно ).
И еще более сложный вопрос, как заставить сервер перейти в режим обратного звонка клиенту? Тем более, на сколько я понимаю, соответствующей записи в адресной книге для входящих подключений нет.
Здравствуйте, fsheet, Вы писали:
F>Здравствуйте, Protey, Вы писали:
P>>Здравствуйте, fsheet, Вы писали:
F>>>А зачем открывать сокет? Ведь связи все-равно еще нету... P>>Дак это. А команду отзвонится клиенту программа получает телепатически? Я так понял, что через инет, а для этого нужен на тачке слушающий сокет. F>Ну не обязательно слушающий, можно просто регулярно проверять почтовый ящик. Но этой части у меня проблем нет, тем более что для начала в качестве события можно рассматриваться запуск программы
P>>RasDial, только ещё надо сформировать запись в телефонной книжке + отлеживать уже установленное соединение. F>В телефонной книжке у клиента уже есть соответствующая запись, предположим с названием "Server". И вот вопрос, как
Не, ты путаешь 2 вещи :
1)Понятие callback в RAS это — КЛИЕНТ звонит на сервер, сервер путём CallerID получет номер, бросает трубу. Перезванивает(callback собственно , Всё хорошо.
2) То, что хочешь ты — это НЕ callback в общепринятом понятии. Это СЕРВЕР выступая в роли КЛИЕНТА звонит на КЛИЕНТА, который выступает в роли СЕРВЕРА. Звучит так себе, но это так ... Терминология имеет смысл если тебе нужно логинится на Remote DeskTop, если нет — ещё нужно настроить VPN+IP параметры, чтобы КЛЕНТ мог ходить через СЕРВЕР в Инет.
F>"активировать" эту запись в режим ожидания обратного звонка с сервера? Очень хотелось бы увидеть примерный код (C,C++,C#,VBA,VB.NET, на чем угодно ).
class STDCLASS TDialThread: public TThreadObject {
protected:
static int DialStatus;
static DWORD DialError;
static VOID WINAPI myRasDialFunc(
UINT unMsg, // type of event that has occurred
RASCONNSTATE rasconnstate, // connection state about to be entered
DWORD dwError // error that may have occurred
){
if(DialStatus != -1)
DialStatus = rasconnstate;
DialError = dwError;
};
DWORD DoRun(){
#define BUFFER_SIZE 2048
DWORD cBufSize = BUFFER_SIZE;
CHAR lpszErrorString[ BUFFER_SIZE ];
DWORD dwRetVal;
LPRASDIALDLG lpInfo = (LPRASDIALDLG) GlobalAlloc(GPTR, sizeof(RASDIALDLG));
lpInfo->dwSize = sizeof(RASDIALDLG);
int nRet;
char lpText[500];
DWORD dwNotifierType = 0;//0xFFFFFFFF;
RASDIALPARAMS DialParam;
ZeroMemory(&DialParam, sizeof(DialParam));
DialParam.dwSize = sizeof(RASDIALPARAMS);
DWORD dwResult;
sprintf(DialParam.szEntryName, "%s", ConnName.c_str());
HRASCONN RasConn = NULL;
#ifdef SUPERDIALER
//nRet = RasDial(NULL, NULL, &DialParam, dwNotifierType/*NULL*/, (LPVOID)Handle/*NULL*/, &RasConn);
nRet = RasDial(NULL, NULL, &DialParam, dwNotifierType/*NULL*/, (LPVOID)myRasDialFunc/*NULL*/, &RasConn);
DialError = 0;
RASCONNSTATUS myStatus;
while(1){
Sleep(500);
if(DialCancel) {
RasHangUp(RasConn);
//Sleep(3000);
DialStatus = -1;
//return 0;
}
myStatus.dwSize = sizeof(RASCONNSTATUS);
/*
dwResult = RasGetConnectStatus(RasConn, &myStatus);
//ERROR_BUFFER_TOO_SMALL
DialStatus = myStatus.rasconnstate;
DialError = myStatus.dwError;
*/
if(DialCancel)
{
//dwResult = RasGetConnectStatus(RasConn, &myStatus);
if(dwResult == ERROR_INVALID_HANDLE){
//DialError = ERROR_INVALID_HANDLE;
DialError = 0;
DialStatus = -1;
break;
//return 2;
}
};
if(DialError) break;
if(DialStatus == RASCS_Connected) break;
if(DialStatus == RASCS_Disconnected)
break;
};
nRet = DialError;
#else
nRet = RasDial(NULL, NULL, &DialParam, NULL, NULL, &RasConn);
#endif
if(nRet){
if(nRet == 619){
} else
if(nRet == 628){
} else
if(nRet == ERROR_PORT_OR_DEVICE){
MessageBox(Handle, "Внимание! Данный модем либо не поддерживает GPRS, либо находится в нерабочем состоянии.\r\nПопробуйте выключить его, после этого включить." , "Ошибка", MB_ICONEXCLAMATION);
} else
if(nRet == ERROR_CONNECTING_DEVICE_NOT_FOUND){
MessageBox(Handle, "Внимание! Данный модем на текущий момент не доступен!\r\n Если это ИК подключение - проверьте находится ли телефон в радусе действия ИК приёмника\r\n\В случае кабельного подключения проверьте включён-ли телефон или надёжность подключения.\r\nПопробуйте выключить его, после этого включить." , "Ошибка", MB_ICONEXCLAMATION);
} else
if(nRet == ERROR_OUTOFORDER){
MessageBox(Handle, "Внимание! Модем либо телефон находится в нерабочем состоянии!\\r\nПопробуйте выключить его, после этого включить. Если это не помогло, возможно у вас не включена услуга 'Мобильный Интернет'" , "Ошибка", MB_ICONEXCLAMATION);
}else
if(nRet == ERROR_BAD_ADDRESS_SPECIFIED){
MessageBox(Handle, "Внимание! Невозможно установить связь с устройством, либо с провайдером! Модем либо телефон находится в нерабочем состоянии!\r\n Попробуйте выключить его, после этого включить. Если это не помогло, возможно у вас не включена услуга 'Мобильный Интернет'" , "Ошибка", MB_ICONEXCLAMATION);
}else{
dwRetVal = RasGetErrorString( nRet, lpszErrorString, cBufSize );
sprintf(lpText, "При дозвоне возникла ошибка %d (%s)! ", nRet, lpszErrorString);//lpInfo->dwError);
MessageBox(Handle, &lpText[0], "Ошибка", MB_ICONEXCLAMATION);
}
DialStatus = -1;
RasHangUp(RasConn);
DialResult = nRet;
return nRet;
}
DialStatus = -1;
DialResult = 0;
return 0;
};
public:
static int DialResult;
static bool DialCancel;
TIsrString ConnName;
HWND Handle;
void CancelDial(){
DialCancel=true;
}
void SetDial(HWND WinHandle, LPTSTR ConnectionName){
Handle = 0;
DialStatus = 0;
DialCancel = false;
DialResult = -1;
ConnName = ConnectionName;
Handle = WinHandle;
};
int TDialThread::DialRes(){
return DialResult;
};
int TDialThread::GetStatus(){
return DialStatus;
};
TDialThread::TDialThread(){
ConnName = "";
//ZeroMemory(ConnName, sizeof(ConnName));
Handle = 0;
DialStatus = 0;
DialCancel = false;
};
};
Креатишь нитку, делаешь SetDial(YourProgramHandle, ConnectionName_like_an_"Client1"_or_"Killer2"_must_exist_in_ServerAdressBook ), запускаешь. Код написан на своих темплейтах, но мысль тут ясна по моему ...
F>И еще более сложный вопрос, как заставить сервер перейти в режим обратного звонка клиенту? Тем более, на сколько я понимаю, соответствующей записи в адресной книге для входящих подключений нет.
Здравствуйте, Protey, Вы писали:
PP>Не, ты путаешь 2 вещи :
P>1)Понятие callback в RAS это — КЛИЕНТ звонит на сервер, сервер путём CallerID получет номер, бросает трубу. Перезванивает(callback собственно , Всё хорошо. P>2) То, что хочешь ты — это НЕ callback в общепринятом понятии. Это СЕРВЕР выступая в роли КЛИЕНТА звонит на КЛИЕНТА, который выступает в роли СЕРВЕРА. Звучит так себе, но это так ... Терминология имеет смысл если тебе нужно логинится на Remote DeskTop, если нет — ещё нужно настроить VPN+IP параметры, чтобы КЛЕНТ мог ходить через СЕРВЕР в Инет.
В принципе этот вариант я рассматривал (когда сервер выступает в роли RAS-client'а а клиент в роли RAS-server'а), но у меня возникли проблемы:
во первых, в настройках RAS-server'а практичесни нету настроек, т.е. некуда даже прописать DNS-сервер, и поэтому (а, скорее всего, не только) у клиента нет связи через сервер.
во вторых, как только сервер присоединяется к клиенту, так на нем сеть престает работать. И куча пакетов идет безответно к клиенту...
А кстати, что такое VPN+IP? Про VPN я только слышал что это некий защищенный протокол-туннель для связи сеток через internet. Но мне-то он зачем, мне скрывать нечнего
F>>"активировать" эту запись в режим ожидания обратного звонка с сервера? Очень хотелось бы увидеть примерный код (C,C++,C#,VBA,VB.NET, на чем угодно ).
P>
class STDCLASS TDialThread: public TThreadObject {
...
};
P>Креатишь нитку, делаешь SetDial(YourProgramHandle, ConnectionName_like_an_"Client1"_or_"Killer2"_must_exist_in_ServerAdressBook ), запускаешь. Код написан на своих темплейтах, но мысль тут ясна по моему ...
Я так понял, что этот класс просто вызывает RasDial(), а с ним я и сам разобрался...
А вот что делать на клиенте (RAS-server'е)? Если учесть что у меня там Windows XP Pro, а в MSDN'ке про MprAdmin-функции написано примерно следующее:
Requirements
Server: Included in Windows Server 2003 and Windows 2000 Server.
Redistributable: Requires RRAS download on Windows NT Server 4.0 SP3.
Header: Declared in Mprapi.h.
Library: Use Mprapi.lib.