Здравствуйте. Есть DSL роутер D'link 2500u/BRU/D. Хочу с неким интервалом получать информацию о статистике DSL (SNR Margin, Attenuation, Rate и т.д) и выводить это например на форму. Проблемма в том, что незнаю как - через web интерфейс подцепиться или на прямую как-то через прошивку? В какую сторону копать информацию на эту тему?
коннектишься к момеду по телнету, посылаешь команду и парсишь ответ (если нужно, можно просто ответ целиком строкой выдать). только узнай в документации или опытным путём команды для запросы интересующих параметров. делал для зюхелевских момедов - работает на ура.
Я так понял, что подключение по telnet к роутеру - недокументированная функция.. Логин и пароль стандартные не подходят.. на форумах говорят, что в сети они выложены, я не нашел.. кто-нибудь знает?
Туплю. Наверно стандартные подходят, просто там после ввода пароля просто появляется символ > и накакого приглашения далее.
Izgoy кстати, для длинков (хотя годится не только для длинков) видел программу (вот только название запамятовал... помню что немцы делали только) - она как раз предоставляет кучу инфы, плюс строит графики - маржины, затухание от частоты и ещё много чего... на её примере можно и сделать тут (посниффать траф - определить команды например) если вспомню - напишу.
вот собственно и нашёл: http://segezha.onego.ru/pr/adsl_link_test.html (ссылка на сайт разраба похоже мертва, а эта ещё пока дышит)
На BRU/D сделана дополнительная защита - надо выполнить команду sh и появится приглашение # и можно будет команды выполнять. Хотя может и вру - попробуй help набрать. Проще на форум D-Link сходить, там была пара программ для телнета и про команды тоже писали, правда придется поискать.
Только теперь вернулся к этой проге, все времени не было. Такая проблемма, написал код: Код (Text): SOCKADDR_IN saddr; ... saddr.sin_family = AF_INET; saddr.sin_port = 23; saddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.1"); connect(sock, (const sockaddr *)&saddr, sizeof(saddr)) ... предполагаю, что бы приконнектится по telnet надо установить соединение на 23 порт. Правильны ли мои сомнения в том что это так? telnet по идее устанавливает соединение при помощи транспорта TCP, значит такое создание сокета Код (Text): sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) считаю верным. Так ли это? Проблема в том, что connect() возвращает SOCKER_ERROR, WSAGetLastError() возвращает ошибку 10061 Как правильно осуществить telnet соединение?
Проблема с приемем данных, делаю так Код (Text): char srBuff[4096]; ... strcpy(srBuff, "admin"); send(sock, (const char*)srBuff, 5, 0); send(sock, (const char*)srBuff, 5, 0); strcpy(srBuff, "adsl info --show"); send(sock, (const char*)srBuff, 16, 0); recv(sock, srBuff, 4096, MSG_WAITALL); cout << srBuff; на строке recv(sock, srBuff, 4096, 0); программа виснет. Где я накосячил?
Ну почитайте вы книжки про винсок - есть хорошая статья на геймдеве про создание клиента и сервера на винсок, лучше чем глупые вопросы задавать.
т.е. проблема именно со стороны не верного использования функции, а не команд telnet? Почитаю про winsock еще...
т.к. сокет неблокирующий то recv() выйдет только при получении 4096 байт или дизконнекте да, почитай доки лучше =)
Ясно, почитал, понял, что recv() блокирующая функция, сделал так Код (Text): HWND GetHanadlMyW(){ #define MY_BUFF_SIZE 1024 HWND hdMW; char NewWindowsTitle[MY_BUFF_SIZE]; char OldWindowsTitle[MY_BUFF_SIZE]; GetConsoleTitle((LPWSTR)OldWindowsTitle, MY_BUFF_SIZE); wsprintf((LPWSTR)NewWindowsTitle, (LPCWSTR)"%d%d", (LPCWSTR)GetTickCount(), (LPCWSTR)GetCurrentProcessId()); SetConsoleTitle((LPWSTR)NewWindowsTitle); Sleep(40); if ( (hdMW = FindWindow(NULL, (LPWSTR)NewWindowsTitle)) == NULL){ cout << "fail. break."; exit(0); }; SetConsoleTitle((LPCWSTR)OldWindowsTitle); return hdMW; } ... void GetRouterData(){ char srBuff[4096]; strcpy_s(srBuff, sizeof("admin"), "admin"); send(sock, (const char*)srBuff, sizeof("admin"), MSG_PEEK); send(sock, (const char*)srBuff, sizeof("admin"), MSG_PEEK); strcpy_s(srBuff, sizeof("adsl info --show"), "adsl info --show"); send(sock, (const char*)srBuff, sizeof("adsl info --show"), MSG_PEEK); WSAAsyncSelect(sock, GetHanadlMyW(), FD_READ, FD_READ); recv(sock, srBuff, 4096, MSG_WAITALL); } теперь recv() возвращает -1
правильно, т.к. еще данные не пришли проверь код ошибки функцией WSAGetLastError(), 99% будет WSAEWOULDBLOCK проверяй в цикле с задержкой или используй WaitForSingleObject() (создаешь event и связываешь его и сокет функцией WSAEventSelect())