ADSL Statistic

Тема в разделе "LANGS.C", создана пользователем Izgoy, 6 янв 2010.

  1. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Здравствуйте.
    Есть DSL роутер D'link 2500u/BRU/D. Хочу с неким интервалом получать информацию о статистике DSL (SNR Margin, Attenuation, Rate и т.д) и выводить это например на форму. Проблемма в том, что незнаю как - через web интерфейс подцепиться или на прямую как-то через прошивку? В какую сторону копать информацию на эту тему?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    коннектишься к момеду по телнету, посылаешь команду и парсишь ответ (если нужно, можно просто ответ целиком строкой выдать).
    только узнай в документации или опытным путём команды для запросы интересующих параметров.
    делал для зюхелевских момедов - работает на ура.
     
  3. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Я так понял, что подключение по telnet к роутеру - недокументированная функция.. Логин и пароль стандартные не подходят.. на форумах говорят, что в сети они выложены, я не нашел.. кто-нибудь знает?
     
  4. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Туплю. Наверно стандартные подходят, просто там после ввода пароля просто появляется символ > и накакого приглашения далее.
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Izgoy
    кстати, для длинков (хотя годится не только для длинков) видел программу (вот только название запамятовал... помню что немцы делали только) - она как раз предоставляет кучу инфы, плюс строит графики - маржины, затухание от частоты и ещё много чего... на её примере можно и сделать тут (посниффать траф - определить команды например)
    если вспомню - напишу.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вот собственно и нашёл: http://segezha.onego.ru/pr/adsl_link_test.html (ссылка на сайт разраба похоже мертва, а эта ещё пока дышит)
     
  7. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Спасибо большое, RamMerLabs!
     
  8. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Только он при включении special logon говорит can not identifi modemtype
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    На BRU/D сделана дополнительная защита - надо выполнить команду sh и появится приглашение # и можно будет команды выполнять. Хотя может и вру - попробуй help набрать. Проще на форум D-Link сходить, там была пара программ для телнета и про команды тоже писали, правда придется поискать.
     
  10. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    в этом DLINKе есть SNMP так что можно поробовать через него забирать
     
  11. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Только теперь вернулся к этой проге, все времени не было.
    Такая проблемма, написал код:
    Код (Text):
    1. SOCKADDR_IN saddr;
    2. ...
    3. saddr.sin_family = AF_INET;
    4. saddr.sin_port = 23;
    5. saddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.1");
    6.  
    7. connect(sock, (const sockaddr *)&saddr, sizeof(saddr))
    8. ...
    предполагаю, что бы приконнектится по telnet надо установить соединение на 23 порт. Правильны ли мои сомнения в том что это так?

    telnet по идее устанавливает соединение при помощи транспорта TCP, значит такое создание сокета
    Код (Text):
    1. sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
    считаю верным. Так ли это?

    Проблема в том, что connect() возвращает SOCKER_ERROR, WSAGetLastError() возвращает ошибку 10061

    Как правильно осуществить telnet соединение?
     
  12. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    10061 это отказ сервера на соединение? Но почему?
     
  13. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Проблема решена. saddr.sin_port = htons(23);
     
  14. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Проблема с приемем данных, делаю так
    Код (Text):
    1. char srBuff[4096];
    2. ...
    3. strcpy(srBuff, "admin");
    4. send(sock, (const char*)srBuff, 5, 0);
    5.  
    6. send(sock, (const char*)srBuff, 5, 0);
    7.  
    8. strcpy(srBuff, "adsl info --show");
    9. send(sock, (const char*)srBuff, 16, 0);
    10.  
    11. recv(sock, srBuff, 4096, MSG_WAITALL);
    12.  
    13. cout << srBuff;
    на строке recv(sock, srBuff, 4096, 0); программа виснет. Где я накосячил?
     
  15. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Не уверен я, что правильно отсылаю команду...
     
  16. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Ну почитайте вы книжки про винсок - есть хорошая статья на геймдеве про создание клиента и сервера на винсок, лучше чем глупые вопросы задавать.
     
  17. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    т.е. проблема именно со стороны не верного использования функции, а не команд telnet? Почитаю про winsock еще...
     
  18. razor

    razor Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    40
    т.к. сокет неблокирующий то recv() выйдет только при получении 4096 байт или дизконнекте

    да, почитай доки лучше =)
     
  19. Izgoy

    Izgoy New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    24
    Ясно, почитал, понял, что recv() блокирующая функция, сделал так

    Код (Text):
    1. HWND GetHanadlMyW(){
    2.     #define MY_BUFF_SIZE 1024
    3.  
    4.     HWND hdMW;
    5.  
    6.     char NewWindowsTitle[MY_BUFF_SIZE];
    7.     char OldWindowsTitle[MY_BUFF_SIZE];
    8.  
    9.     GetConsoleTitle((LPWSTR)OldWindowsTitle, MY_BUFF_SIZE);
    10.  
    11.     wsprintf((LPWSTR)NewWindowsTitle, (LPCWSTR)"%d%d", (LPCWSTR)GetTickCount(), (LPCWSTR)GetCurrentProcessId());
    12.  
    13.     SetConsoleTitle((LPWSTR)NewWindowsTitle);
    14.  
    15.     Sleep(40);
    16.  
    17.     if ( (hdMW = FindWindow(NULL, (LPWSTR)NewWindowsTitle)) == NULL){
    18.         cout << "fail. break.";
    19.         exit(0);
    20.     };
    21.  
    22.     SetConsoleTitle((LPCWSTR)OldWindowsTitle);
    23.  
    24.     return hdMW;
    25. }
    26.  
    27. ...
    28.  
    29. void GetRouterData(){
    30.     char srBuff[4096];
    31.  
    32.     strcpy_s(srBuff, sizeof("admin"), "admin");
    33.  
    34.     send(sock, (const char*)srBuff, sizeof("admin"), MSG_PEEK);
    35.  
    36.     send(sock, (const char*)srBuff, sizeof("admin"), MSG_PEEK);
    37.  
    38.     strcpy_s(srBuff, sizeof("adsl info --show"), "adsl info --show");
    39.     send(sock, (const char*)srBuff, sizeof("adsl info --show"), MSG_PEEK);
    40.  
    41.     WSAAsyncSelect(sock, GetHanadlMyW(), FD_READ, FD_READ);
    42.  
    43.     recv(sock, srBuff, 4096, MSG_WAITALL);
    44. }
    теперь recv() возвращает -1
     
  20. razor

    razor Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    40
    правильно, т.к. еще данные не пришли

    проверь код ошибки функцией WSAGetLastError(), 99% будет WSAEWOULDBLOCK

    проверяй в цикле с задержкой или используй WaitForSingleObject() (создаешь event и связываешь его и сокет функцией WSAEventSelect())