Вниз
Скачать: CL | DM;

как определить дисконнект?   Найти похожие ветки 

← →
nockes   (2002-07-11 23:23) [0]

в общем такая проблема. на ночь иногда оставляю комп и закачиваю чё-нить с нета. но проблема чатые дисконнекты. и вот что бы комп просто так не грелся всю ночь, нужно определить когда происходит дисконнект и выключить его. как это можно осуществить?


← →
Geser ©   (2002-07-11 23:58) [1]

А не проще ли в свойствах диалап соединения указать: пересоединять при обрыве связи?


← →
nockes   (2002-07-12 00:02) [2]

я качаю или с мирка, там так просто не от делаешься, или с фтп, там вообще не с каждого айпи зайдёшь. в общем, не думую что проще .


← →
Geser ©   (2002-07-12 00:09) [3]

С мирком не знаю, но с фтп Вы погорячились. При dial-up соединении , каким бы образом(программно или с помощью Виндовской утилитки) оно не было создано, IP адрес будет разный. Ну а по существу думаю что стоит с некоторой периодичностью пинговать два( для надёжности ) каких-нибудь IP адреса, допустим две поисковые системы. Шанс что они одновременно выйдут из строя ничтожно мал, так, что если от этих двух адресов нет ответа можно утверждать, что произошёл дисконнект.


← →
nockes   (2002-07-12 00:16) [4]

там на фтп стоит ограничитель 212.* не пропускает, 195.* пропускает, а пров выдаёт по разному. а нельзяли это без пинга сделать? и если нет, то как сделать задержку минут в пять?


← →
Geser ©   (2002-07-12 00:28) [5]

Включить таймер с 5-минутным интервалом. :-)


← →
Geser ©   (2002-07-12 00:32) [6]

Включить таймер с 5-минутным интервалом. :-) Вот кусок из моей старой программы, писал не я.

type
ip_option_information = packed record // Информация заголовка IP (Наполнение
// этой структуры и формат полей описан в RFC791.
Ttl : byte; // Время жизни (используется traceroute-ом)
Tos : byte; // Тип обслуживания, обычно 0
Flags : byte; // Флаги заголовка IP, обычно 0
OptionsSize : byte; // Размер данных в заголовке, обычно 0, максимум 40
OptionsData : Pointer; // Указатель на данные
end;

icmp_echo_reply = packed record
Address : u_long; // Адрес отвечающего
Status : u_long; // IP_STATUS (см. ниже)
RTTime : u_long; // Время между эхо-запросом и эхо-ответом
// в миллисекундах
DataSize : u_short; // Размер возвращенных данных
Reserved : u_short; // Зарезервировано
Data : Pointer; // Указатель на возвращенные данные
Options : ip_option_information; // Информация из заголовка IP
end;

PIPINFO = ^ip_option_information;
PVOID = Pointer;

function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL" name "IcmpCloseHandle";
function IcmpSendEcho(
IcmpHandle : THandle; // handle, возвращенный IcmpCreateFile()
DestAddress : u_long; // Адрес получателя (в сетевом порядке)
RequestData : PVOID; // Указатель на посылаемые данные
RequestSize : Word; // Размер посылаемых данных
RequestOptns : PIPINFO; // Указатель на посылаемую структуру
// ip_option_information (может быть nil)
ReplyBuffer : PVOID; // Указатель на буфер, содержащий ответы.
ReplySize : DWORD; // Размер буфера ответов
Timeout : DWORD // Время ожидания ответа в миллисекундах
) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
hIP : THandle;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
pHostEn : PHostEnt;
wVersionRequested : WORD;
lwsaData : WSAData;
error : DWORD;
destAddress : In_Addr;
begin

// Создаем handle
hIP := IcmpCreateFile();

GetMem( pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer));
pIpe.Data := @pingBuffer;
pIpe.DataSize := sizeof(pingBuffer);

wVersionRequested := MakeWord(1,1);
error := WSAStartup(wVersionRequested,lwsaData);
if (error <> 0) then
begin
Memo1.SetTextBuf("Ошибка вызова "+
"WSAStartup().");
Memo1.Lines.Add("Код ошибки "+IntToStr(error));
Exit;
end;

pHostEn := gethostbyname(pchar(Edit1.text));
error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf("Ошибка вызова "+
"gethostbyname().");
Memo1.Lines.Add("Error code: "+IntToStr(error));
Exit;
end;

destAddress := PInAddr(pHostEn^.h_addr_list^)^;

// Посылаем ping-пакет
Memo1.Lines.Add("Пингую " +
pHostEn^.h_name+" ["+
inet_ntoa(destAddress)+"] "+

IntToStr(sizeof(pingBuffer)) +
" байтами данных ");

IcmpSendEcho(hIP,
destAddress.S_addr,
@pingBuffer,
sizeof(pingBuffer),
Nil,
pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer),
5000);

error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf("Ошибка вызова "+
"IcmpSendEcho()");
Memo1.Lines.Add("Код ошибки "+IntToStr(error));
Exit;
end;

// Смотрим некоторые из вернувшихся данных
Memo1.Lines.Add("Ответ от "+
IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
IntToStr(HiByte(HiWord(pIpe^.Address))));
Memo1.Lines.Add("Время ответа "+IntToStr(pIpe.RTTime)+" мс");

IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
Edit1.Text:="";

end;


← →
Geser ©   (2002-07-12 00:43) [7]

http://delphibase.endimus.com/?action=viewfunc&topic=netconnect&id=10114


← →
nockes   (2002-07-12 00:50) [8]

спосибо



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.009 c
14-81416
Феликс
2002-06-26 23:13
2002.07.25
Бразилия-Германия! Ваши предположения.


14-81462
koks
2002-06-27 10:59
2002.07.25
QReport vs FreeReport


1-81287
vixic
2002-07-12 07:47
2002.07.25
MainMenu


14-81411
Александр
2002-06-26 01:23
2002.07.25
Интересный глюк InternetExplorer 6.0


7-81505
e_Dimon
2002-05-05 12:20
2002.07.25
Энергосберегающие функции.....




   Наверх