Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Перезагрузка роутера


Автор: razumsap 11.1.2014, 09:05
Добрый день.
Написал небольшой код по перезагрузке роутера с помощью компонента IdTelnet.
Роутер перезагружается, но после выполнения IdTelnet1.Disconnect происходит сообщение об ошибке.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  login,password,reboot: string;
  i:integer;
begin

    Login       :='admin';
    Password:='admin';
    reboot     :='reboot';

if not idtelnet1.Connected then begin
   idtelnet1.Connect;

   for i:=1 to length(login)    do idtelnet1.SendCh(login[i]);
       idtelnet1.SendCh(#13);
   for i:=1 to length(password) do idtelnet1.SendCh(password[i]);
       idtelnet1.SendCh(#13);
   for i:=1 to length(reboot)   do idtelnet1.SendCh(reboot[i]);
       idtelnet1.SendCh(#13);

       IdTelnet1.Disconnect;
   end;

end;


Если сделать просто IdTelnet1.Connected, а затем IdTelnet1.Disconnect - ошибки никакой не происходит.

Может что-то я не дописал, кто сталкивался, помогите.

Автор: Vas 11.1.2014, 09:39
Может просто сделать аналогичную проверку и для дисконнекта, да и обернуть это все в блок try
Код

try
  if idtelnet1.Connected then  //если еще подцеплены, то дисконнект, иначе уже и так отвалились
     idtelnet1.Disconnect; 
except
  ShowMessage('Что-то пошло не так');
end;


P.S. А если у роутера логин и пароль не admin admin, будете перекомпилировать проект?

Автор: razumsap 11.1.2014, 11:54
да, я делаю для своего роутера, п.э. логин и пароль такие и оставлю. А вот по поводу кода что вы привели 

try .. except - сдесь можно отловить ошибку но не выводить её никуда, просто чтоб программа отработала и "корректно" завершила работу?

Автор: Vas 11.1.2014, 13:06
Можно, оставьте блок except пустым

Автор: Poseidon 11.1.2014, 23:02
Одному мне кажется, что при перезагрузке роутера дисконект происходит автоматически?

Автор: Vas 12.1.2014, 15:50
Цитата(Poseidon @  11.1.2014,  23:02 Найти цитируемый пост)
Одному мне кажется, что при перезагрузке роутера дисконект происходит автоматически? 

Аналогично,  потому в примере я и  добавил проверку на установленное соединение перед дисконнектом.

Автор: razumsap 13.1.2014, 08:54
пробовал, после перезагрузки, проверка соединения показывала, что соединение оставалось, так что диссконнект необходим

Автор: Vas 13.1.2014, 15:46
А почему тогда ошибка валится при дисконнекте?

Автор: Delvish 13.1.2014, 16:08
Как только ты посылаешь команду роутеру на перезагрузку, тот уходит в перезагрузку и, соответственно, тут же обрывает все подключения и тушит все демоны (KILL и TERM какбэ). Так что у тебя связь со стороны роутера обрывается. Таким образом, команда на дисконнект тебе не нужна - дисконнект уже за тебя произведен роутером.
Только что проверил - если хост разрывает соединение, то IdTelnet.Connected при проверке возвращает False и можно смело опять пытаться соединиться

Автор: razumsap 16.1.2014, 22:56
Странно конечно, я после кода перезагрузки, добавил такой вот код 

Код

if idtelnet1.Connected = False then
   idtelnet1.Connect;


и он не отработал, получается что соединение осталось. 

Автор: kami 17.1.2014, 16:52
Цитата(razumsap @  16.1.2014,  22:56 Найти цитируемый пост)
Странно конечно, я после кода перезагрузки, добавил такой вот код 

Варианта два:
1. Роутер начал процедуру перезагрузки, но еще не разорвал соединение (Ваш компьютер тоже не моментально выключается).
2. Соединение не закрывается, а грубо "рвется". В этом случает уведомления корреспондента не производится, узнать о том - живо соединение или нет, можно только попытавшись отправить в него что-нибудь. В этом случае, если соединение "мертво", будет ошибка с последующим дисконнектом.

Автор: razumsap 17.1.2014, 20:33
Цитата(kami @  17.1.2014,  16:52 Найти цитируемый пост)
будет ошибка с последующим дисконнектом.
 
Так и есть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)