Сервер RAS звонит клиенту
От: fsheet  
Дата: 26.08.04 00:35
Оценка:
Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям.
Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает...
Я вижу возможное решение так: На сервере стоит спец. программа которая по условному сигналу (из инета) переводит "входящие подключения" в режим "ответный вызов" клиенту, а на клиенте, другая спец. программа посылает усл. сигнал серверу и переводит клиента в режим ожидания ответного вызова...
В общем все тоже самое что и звонок клиента серверу с ответным вызовом, только вместо первого звонка клиента серверу клиент посылал бы сигнал серверу например через интернет.

Вот вопрос, как заставить сервер RAS перейти в режим перезвона клиенту, а клиента в режим ожидания?
И вообще, может есть более простое решение?
Re: Сервер RAS звонит клиенту
От: butcher Россия http://bu7cher.blogspot.com
Дата: 26.08.04 04:43
Оценка:
Здравствуйте, fsheet, Вы писали:

F>Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям.

F>Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает...
В принципе, я думаю, если правильно настроить маршрутизацию, то всё должно работать. Покрайней мере, если бы это были UNIX'и я бы сделал за 5 минут
Под виндой тоже, я думаю проблем не должно быть.

Нет ничего невозможного..
Re: Сервер RAS звонит клиенту
От: Protey Россия  
Дата: 26.08.04 06:25
Оценка:
Здравствуйте, fsheet, Вы писали:

F>Ситуация такая: есть сервер (Windows 2003 Server) с телефоном на который звонить нельзя! И есть клиент (Windows XP Pro) тоже с телефоном, но на него звонить можно. Так вот, надо их как-то связать так, чтобы клиент имел полноценный доступ к серверу и к его локальным и глобальным сетям.

F>Сразу предупреждаю что в ностройках сетей я полный профан, я сетью могу только пользоваться... И у меня получается так: если установить "входящие подключения" на сервере, и звонить с клиента, то все отлично работает... А если наоборот, то нифига не работает...
F>Я вижу возможное решение так: На сервере стоит спец. программа которая по условному сигналу (из инета) переводит "входящие подключения" в режим "ответный вызов" клиенту, а на клиенте, другая спец. программа посылает усл. сигнал серверу и переводит клиента в режим ожидания ответного вызова...
F>В общем все тоже самое что и звонок клиента серверу с ответным вызовом, только вместо первого звонка клиента серверу клиент посылал бы сигнал серверу например через интернет.

F>Вот вопрос, как заставить сервер RAS перейти в режим перезвона клиенту, а клиента в режим ожидания?

F>И вообще, может есть более простое решение?

Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.
Re[2]: Сервер RAS звонит клиенту
От: fsheet  
Дата: 26.08.04 07:10
Оценка:
Здравствуйте, Protey, Вы писали:

P>Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.


В том-то и дело, что нельзя звонить! По этому и предпологается что клиент будет посылать сигнал серверу о звонке через интернет.
Re[3]: Сервер RAS звонит клиенту
От: Protey Россия  
Дата: 26.08.04 07:24
Оценка:
Здравствуйте, fsheet, Вы писали:

F>Здравствуйте, Protey, Вы писали:


P>>Ну, в W2000,XP,2003 есть режим 'callback', там клиент всёже звонит на сервер, определяется его номер телефона, сервер бросает трубку и перезванивает на этот номер. Это занимает секунд 10.


F>В том-то и дело, что нельзя звонить! По этому и предпологается что клиент будет посылать сигнал серверу о звонке через интернет.


Военная база что ли? Ж)
Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.
Re[4]: Сервер RAS звонит клиенту
От: fsheet  
Дата: 26.08.04 08:44
Оценка:
Здравствуйте, Protey, Вы писали:

P>Военная база что ли? Ж)

P>Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.

А зачем открывать сокет? Ведь связи все-равно еще нету...
А вообще я и предпологал присать программу, только вот как (какими функциями с какими параметрами) перевести сервер в режим обратного звонка, а клиента в режим ожидания обратного звонка от сервера? Я смотрел в сторону RasDial() но ничего не высмотрел.
Re[5]: Сервер RAS звонит клиенту
От: Protey Россия  
Дата: 26.08.04 08:51
Оценка:
Здравствуйте, fsheet, Вы писали:

F>Здравствуйте, Protey, Вы писали:


P>>Военная база что ли? Ж)

P>>Тогда вариант 2 — пишем маааленькую прожку, которая всё это за нас делает. ИМХО в Винде подобные издевательства в стандартной поставке не делаются. Там ничего сложного — открывается слушающий сокет, по команде средствами RAS делается callback. Ну ещё VPN надо сконфигурировать со шлюзами. Сам понимаещь слишком много неизвестных для того, чтобы дать конкретный совет.

F>А зачем открывать сокет? Ведь связи все-равно еще нету...

Дак это. А команду отзвонится клиенту программа получает телепатически? Я так понял, что через инет, а для этого нужен на тачке слушающий сокет.
F>А вообще я и предпологал присать программу, только вот как (какими функциями с какими параметрами) перевести сервер в режим обратного звонка, а клиента в режим ожидания обратного звонка от сервера? Я смотрел в сторону RasDial() но ничего не высмотрел.
RasDial, только ещё надо сформировать запись в телефонной книжке + отлеживать уже установленное соединение.
Re[6]: Сервер RAS звонит клиенту
От: fsheet  
Дата: 26.08.04 09:32
Оценка:
Здравствуйте, Protey, Вы писали:

P>Здравствуйте, fsheet, Вы писали:


F>>А зачем открывать сокет? Ведь связи все-равно еще нету...

P>Дак это. А команду отзвонится клиенту программа получает телепатически? Я так понял, что через инет, а для этого нужен на тачке слушающий сокет.
Ну не обязательно слушающий, можно просто регулярно проверять почтовый ящик. Но этой части у меня проблем нет, тем более что для начала в качестве события можно рассматриваться запуск программы

P>RasDial, только ещё надо сформировать запись в телефонной книжке + отлеживать уже установленное соединение.

В телефонной книжке у клиента уже есть соответствующая запись, предположим с названием "Server". И вот вопрос, как
"активировать" эту запись в режим ожидания обратного звонка с сервера? Очень хотелось бы увидеть примерный код (C,C++,C#,VBA,VB.NET, на чем угодно ).

И еще более сложный вопрос, как заставить сервер перейти в режим обратного звонка клиенту? Тем более, на сколько я понимаю, соответствующей записи в адресной книге для входящих подключений нет.
Re[7]: Сервер RAS звонит клиенту
От: Protey Россия  
Дата: 07.09.04 14:32
Оценка:
Здравствуйте, 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>И еще более сложный вопрос, как заставить сервер перейти в режим обратного звонка клиенту? Тем более, на сколько я понимаю, соответствующей записи в адресной книге для входящих подключений нет.
Re[8]: Сервер RAS звонит клиенту
От: fsheet  
Дата: 08.09.04 12:02
Оценка:
Здравствуйте, 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.
... << RSDN@Home 1.1.4 @@subversion >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.