Консультация № 181464
19.12.2010, 22:30
84.23 руб.
0 57 1
Здравствуйте, уважаемые эксперты!

Обращаюсь к вам с такой вот просьбой.
Напишите мне программу(с наглядным интерфейсом(простым)) на Delphi 7 которая выполняет следующую функцию:
программа проверяет наличие активного соединения с интернетом и если оно не активно, то программа включает интернет.

Ситуация такая. У меня интернет. Стандартные провода от хаба. Но он непостоянен....тоисть он может если я включаю utorrent выключиться или поработать какое то время и снова выключиться. Постоянно передключаться не хочется(НАДОЕЛО)....Хочется чтобы за меня это делала программа. Сам лично не имею представления какие проверки писать и какие функции/процедуры использовать. Стандартная функция не работает(переподключения при разрыве связи) почему то.

Кратко о системе:
Win Vista Home Premium 32разрядная

Оформите ответ как архив с программой в которой есть исходники для самостоятельного разбора и возможной модернизации.

Заранее спасибо.

Еще буду признателен если натолкнете на литературу для подобных программ. Я так думаю тут все через модуль WINApi

Обсуждение

Неизвестный
20.12.2010, 13:26
общий
может быть...
Неизвестный
20.12.2010, 13:31
общий
Я так посмотрел....может правда эта функция проверки состояния интернета проверяет сеть только???сеть и инет....даже если и инета нет она проверит тока сеть...
Неизвестный
20.12.2010, 13:34
общий
Уважаемый Евгений/Genia007/
Только наблюдал парадокс работы программы. Я отключил кабель от ноутбука и программа все равно говорит что интернет активен.....напрашивается вопрос....что она конкретно определяет?? получается функция не работает которая в исходниках
Неизвестный
20.12.2010, 13:38
общий
Ведь она даже определяет интернет если сеть не активна
давно
Профессионал
153662
1070
20.12.2010, 13:39
общий
А если так попробовать:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
flag: DWORD;
result,i : Boolean;
begin
Result:= InternetGetConnectedState(@flag, 0);
if not Result then
begin
Button1.Click;
Form1.Caption:= 'Интернет не подключен, подключаюсь';
end
else
begin
i:= InternetCheckConnection(PChar('https://rfpro.ru'), $00000001, 0);
if i then
Form1.Caption:= 'Интернет подключен'
else
begin
Form1.Caption:= 'Интернет не подключен, подключаюсь';
Button1.Click;
end;
end;
end;
у меня работает.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
20.12.2010, 13:41
общий
У меня WinXp, может в этом разница.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
20.12.2010, 13:47
общий
Я думаю я знаю в чем ошибка.....подключения вызывается но быстро пропадает....а инет неактивен....оно говорит что подключаюсь но толку нет...только мигает командная строка в пуске.....может или не работает функция для таких соединений или чтото надо как то иначе? может мой касяк?? я ввожу имя соединения которое указано было при его создании...ну там VPN-Интернет "Белогорье"...логин и пас
Неизвестный
20.12.2010, 13:48
общий
может функция не может подключиться....
Неизвестный
20.12.2010, 13:49
общий
лог пас и имя соединение вводятся верно
Неизвестный
20.12.2010, 13:49
общий
лог пас и имя соединение вводятся верно
Неизвестный
20.12.2010, 13:51
общий
Цитата: Евгений/Genia007/
Если у Вас соединение с интернетом через ADSL модем, то можно использовать команду rasdial.
Получится процедура типа этой:
Код:
uses shellapi, WinInet;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
cmd, param, files, dir: PChar;
begin
// rasdial.exe "имя соеденения" "имя пользователя" "пароль"
cmd := 'open';
files:= 'rasdial.exe';
param := PChar('"' + Entry.Text + '"' + ' ' + '"' + User.Text + '"' + ' ' + '"' + Pass.Text + '"');
dir := 'C:';
// вызываем rasdial.exe через Shellexecute
ShellExecute(Self.Handle, cmd, files, param, dir, SW_SHOWMINNOACTIVE);
end;
, при соединении через Dial Up процедура изменится, ну и в таймере проверять активное соединение или нет.


Может это на vpn не распотраняется??? функция просто не может найти тип нужного соединения?
давно
Профессионал
153662
1070
20.12.2010, 13:57
общий
Я сейчас тоже пробовал выдёргивать провод из модема, получается задержка на распознание 7 секунд, надо увеличить время таймера. Попробуйте эту процедуру таймера:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
flag: DWORD;
result,i : Boolean;
begin
Result:= InternetGetConnectedState(@flag, 0);
if not Result then
begin
Timer1.Enabled:= false;
Button1.Click;
Form1.Caption:= 'Интернет не подключен, подключаюсь';
end
else
begin
i:= InternetCheckConnection(PChar('https://rfpro.ru'), $00000001, 0);
if i then
Form1.Caption:= 'Интернет подключен'
else
begin
Form1.Caption:= 'Интернет не подключен, подключаюсь';
Timer1.Enabled:= false;
Button1.Click;
end;
end;
end;
время на таймере 10 сек.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
20.12.2010, 13:58
общий
Вы можете запустить интернет не ярлыком а моей прогой (кнопка подключить)? Если да то функция подходит.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
20.12.2010, 13:59
общий
щас проверим
Неизвестный
20.12.2010, 14:05
общий
Так...вставил затестил....кнопка Разьединить не работает....она работает будто кнопка старт......пишит что инет активен....
Неизвестный
20.12.2010, 14:11
общий
помоему простофункция не подходит или как то должно быть включение поинакому...а можно просто не искать расдиал и включать а именно запускать с раб стола ярлык с именем и в нем искать кнопку, которая просто нажмет на нее и все
давно
Мастер-Эксперт
425
4118
20.12.2010, 14:18
общий
Единственный надёжный способ проверки наличия интернета - пингануть какой-нибудь интернет-ресурс. Об этом уже не один десяток лет пишут в форумах в ответ на вопрос о проверки подключения. Проверка сети из WinAPI не даёт гарантии доступа к ресурсу, поэтому не стоит на него уповать. Единственный и 100%-но надёжный способ - пинг.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.12.2010, 14:21
общий
хорошо.....пинг есть пинг...он делается....но как если нет пинга подключить соединение? стандартно неудается...как то можно запускать ярлык? он на рабочем столе и там все настройки автомат.....
давно
Мастер-Эксперт
425
4118
20.12.2010, 14:21
общий
В дополнение.
Вы можете проверять, не потеряно ли VPN-соединение, вызывая rasdial.exe без параметров. Если в ответ Вы получили список названий соединений, заначит соединение ещё держится, если же в ответ получаете строку "Отсутствуют подключения", значит VPN упало.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
20.12.2010, 14:22
общий
Цитата: 324791
как то можно запускать ярлык? он на рабочем столе и там все настройки автомат.....

Вам не нужен ярлык. Параметрами rasdial, при запуске соединения, являются все необходимые параметры - имя соединения, логи и пароль. Зачем Вам ярлык?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.12.2010, 14:26
общий
Адресаты:
Вам не нужен ярлык. Параметрами rasdial, при запуске соединения, являются все необходимые параметры - имя соединения, логи и пароль. Зачем Вам ярлык?


Я же говорю...пробовали подключение через расдиал когда ооно не активно....и оно просто ничего не делает....появляется внизу окошко cmd и сразу уходит...а соединения не происходит.....
Неизвестный
20.12.2010, 14:28
общий
Просто я подумал что если как вот вы говорите что проверяем пинг и если его нет, то мы включаем ярлык со стола и программа сама давит на нем кнопку "ок".... я тут такой просто пока выход вижу в виду отсутствия работоспособности программы написанной GENIA007
давно
Мастер-Эксперт
425
4118
20.12.2010, 14:32
общий
Не видя, с какими параметрами Вы запускаете rasdial, ничего нельзя сказать по этому поводу, сами понимаете. То, что rasdial с VPN работает - я Вам гарантирую. У меня на работе сервак подключается к VPN серверу именно таким образом.
Для диагностики проблемы запустите консоль, наберите там:
rasdial Название_Соединения Логин Пароль
и посмотрите, что программа Вам выдаёт в ответ.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.12.2010, 14:41
общий
Ура) Заработало.....в общем дело было вот в такой ошибке..... командная строка не распознает русские буквы в имени соединения и поэтому она и не могла соединится с vpn
Неизвестный
20.12.2010, 14:41
общий
Уважаемые эксперты оформляйте ответ!
Неизвестный
20.12.2010, 14:49
общий
только еще 1 аспект погодите
Неизвестный
20.12.2010, 14:49
общий
сделайте так чтобы пароль от интернета скрывался ******** для безопасности
Неизвестный
20.12.2010, 14:50
общий
а в архиве прикрепите готовую програму с исходниками
давно
Мастер-Эксперт
425
4118
20.12.2010, 15:37
общий
Ну, сейчас Евгений/Genia007/ поужинает бешбармаком и кумысом, и всё Вам оформит.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессионал
153662
1070
20.12.2010, 17:43
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!
Могу предложить свой вариант решения. Для подключения к интернету использую консольную команду rasdial:
выполняет автоматический набор номера для клиентов Microsoft. Команда rasdial, запущенная без параметров, показывает состояние текущих подключений.
Синтаксис

rasdial имя_подключения [имя_пользователя [{пароль|*}]] [/domain:домен] [/phone:номер_телефона] [/callback:номер_для_ответного_вызова] [/phonebook:путь_к_телефонной_книге] [/prefixsuffix]

rasdial [имя_подключения] /disconnect
Параметры
имя_подключения Требуется при подключении к записи телефонной книги (.pbk). Задает запись текущего файла .pbk из корневой_папки_системы\System32\Ras. Если имя_подключения содержит пробелы, его следует заключать в кавычки (т. е. "имя_подключения").

Файл Rasphone.pbk используется по умолчанию, если не задана Личная_телефонная_книга. Если она задана, используется файл имя_пользователя.pbk. Имя выводится в заголовке окна Rasphone при задании личной телефонной книги. В случае конфликта имен происходит добавление цифр.
имя_пользователя [{пароль|*}] Задает имя пользователя и пароль для подключения. Если используется символ звездочки, пользователю выдается запрос на ввод пароля, но вводимые символы не отображаются. /domain:домен Задает домен, в котором находится учетная запись пользователя. Если этот параметр отсутствует, используется последнее значение поля Домен диалогового окна Подключение к. /phone:номер_телефона Заменяет номер телефона, заданный для телефонного номера данной записи в файле телефонной книги Rasphone.pbk. /callback:номер_для_ответного вызова Заменяет номер телефона для ответного вызова, заданный для записи из файла телефонной книги Rasphone.pbk. /phonebook:путь_к_телефонной_книге Задает путь к файлу телефонной книги. По умолчанию задан системный_корневой_каталог\System32\Ras\имя_пользователя.pbk. Можно указать полный путь к файлу. /prefixsuffix Применяет к набираемому номеру телефона параметры набора номера TAPI для текущего местоположения. Эти параметры настраиваются в телефонной службе с помощью компонента "Параметры телефона и модема", находящегося на панели управления. По умолчанию этот параметр отключен. /disconnect Данный параметр требуется при отключении. Отключает заданное подключение. Отключение также выполняется с помощью ввода параметра /d.

Примечания

* Команда rasdial не поддерживает следующие функции Rasphone.exe:
- Записи, требующие ввода данных в терминальном режиме в процессе набора номера.
- Набор номера через оператора или вручную.

Для определения подключения к интернету функцию InternetGetConnectedState:
содержится в wininet.dll (IE4 / IE5) и показывает состояние подключения к сети локальной системы. Она довольно проста в использовании и возвращает TRUE, если присутствует соединение с интернетом, иначе FALSE.

Так же функция содержит параметр dwFlags. После вызова функции, dwFlags содержит состояние текущего соединения.

А для пинга функцию InternetCheckConnection:
функция попытается определить доступность сервера, определяемого из URL, который послан функции в качестве параметра, с помощью пинга. Если в вызове функции был установлен флаг $00000001, а в качестве URL был послан NULL, функция проверит не имеется ли входа в серверную базу данных ближайшего сервера. Если такой сервер существует, то функция выполнит пинг этого сервера.

Вот код программы
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Entry: TEdit;
User: TEdit;
Pass: TEdit;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button3: TButton;
Label4: TLabel;
Sait: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses shellapi, WinInet;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); // Запускаем Интернет
var
cmd, param, files, dir: PChar;
begin
// rasdial.exe "имя соеденения" "имя пользователя" "пароль"
cmd:= 'open';
files:= 'rasdial.exe';
param:= PChar('"' + Entry.Text + '"' + ' ' + '"' + User.Text + '"' + ' ' + '"' + Pass.Text + '"');
dir:= 'C:';
// вызываем rasdial.exe через Shellexecute
ShellExecute(Self.Handle, cmd, files, param, dir, SW_SHOWMINNOACTIVE);
Timer1.Enabled:= true;
end;

procedure TForm1.Button2Click(Sender: TObject); // Отрубаем Интернет
var
cmd, param, files, dir: PChar;
begin
cmd:= 'open';
files:= 'rasdial.exe';
param:= PChar('"' + Entry.Text + '"' + ' /DISCONNECT');
dir:= 'C:';
ShellExecute(Self.Handle, cmd, files, param, dir, SW_SHOWMINNOACTIVE);
end;

procedure TForm1.Timer1Timer(Sender: TObject); // Проверяем доступность Интернета
var
flag: DWORD;
begin
// Проверяем подключен ли Интернет и дополнительно для подстраховки пинингуем любой сайт, например https://rfpro.ru
if (not InternetGetConnectedState(@flag, 0)) Or (not InternetCheckConnection(PChar(Sait.Text), $00000001, 0)) then
begin
Timer1.Enabled:= false;
Button1.Click;
Form1.Caption:= 'Интернет не подключен, подключаюсь';
end
else
Form1.Caption:= 'Интернет подключен';
end;

procedure TForm1.Button3Click(Sender: TObject); // Запускаем или тормозим мониторинг доступности Интернета
begin
If Timer1.Enabled then
Timer1.Enabled:= false
else
begin
Timer1.Enabled:= true;
Timer1.OnTimer(Timer1);
end;
end;

end.


, а весь проект в приложении. В поле имя соединения записываем имя своего соединения, которое можно посмотреть если навести курсор на значок в трее, в поле имя пользователя вносим логин для соединения и в поле пароль впечатываем пароль для входа в интернет. Если подключение одно и не требуется постоянно менять пользователя и пароль, то удобнее внести эти данные на этапе разработке программы до компиляции.
Прикрепленные файлы:
5
Отличная работа! 5 баллов!
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа