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

Проверка соединения с интернетом - как гарантированно?   Найти похожие ветки 

← →
lipskiy ©   (2003-09-04 23:37) [0]

Использую в свой программе нижеприведенный код для проверки наличия коннекта. Все хорошо, но иногда приходят письма от юзеров, что у них моя программа не качает. Даю им тест - без проверки коннекта все работает, сама проверка коннекта дает результат, что нет коннекта.

Один описал свое подключение к инету так:
У меня выделенная линия 2 Мб, используется прозрачное проксирования для 80-го порта через Squid остальные незапрещенные порты работают через NAT.

Другой так:
Про сеть почти ничего к сожалению не знаю: Домашняя сеть организована каким то некомерческим партнерством домашних сетей, связь с провайдером вроде через ADSL прокси сервера нет.

Чего в коде проверки коннекта недостаточно, чтобы покрыть все 100% вариантов подключения к инету? Или может есть какой другой способ, гарантирующий правильную проверку?

Вот собственно код (писаный не мной, я в нем мало что понимаю):

function CheckInetConnect:byte;
const
cERROR_BUFFER_TOO_SMALL = 603;
cRAS_MaxEntryName = 256;
cRAS_MaxDeviceName = 128;
cRAS_MaxDeviceType = 16;
type
HRASConn = DWord;
PRASConn = ^TRASConn;
TRASConn = record
dwSize: DWORD;
rasConn: HRASConn;
szEntryName: array [0..cRAS_MaxEntryName] of Char;
szDeviceType: array [0..cRAS_MaxDeviceType] of Char;
szDeviceName: array [0..cRAS_MaxDeviceName] of char;
end;
TRasEnumConnections =
function (RASConn: PrasConn; { buffer to receive Connections data }
var BufSize: DWord; { size in bytes of buffer }
var Connections: DWord { number of Connections written to buffer }
): LongInt; stdcall;

//---------------------------------

function RasConnectionCount : Integer;
var
RasDLL: HInst;
Conns: array [1..4] of TRasConn;
RasEnums: TRasEnumConnections;
BufSize: DWord;
NumConns: DWord;
RasResult: Longint;
begin
Result:= 0;
// Загрузка библиотеки
RasDLL:= LoadLibrary("rasapi32.dll");
if RasDLL = 0 then exit;
try
RasEnums:= GetProcAddress(RasDLL,"RasEnumConnectionsA");
if @RasEnums = nil then
raise ERasError.Create("Ошибка вызова функции RasEnumConnectionsA из rasapi32.dll");
Conns[1].dwSize:= Sizeof (Conns[1]);
BufSize:= SizeOf(Conns);
RasResult:= RasEnums(@Conns, BufSize, NumConns);
If (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then Result:= NumConns;
finally
FreeLibrary(RasDLL);
end;

end;

//---------------------------------

var
Reg : TRegistry;
bUseProxy : Boolean;
UseProxy : LongWord;

begin
Result:= 0;
Reg:= TRegistry.Create;
with REG do
try
try
RootKey:= HKEY_CURRENT_USER;
if OpenKey("\Software\Microsoft\Windows\CurrentVersion\Internet settings",False) then
begin
// Пробуем прочитать и ловим ошибку
if GetDataType("ProxyEnable") = rdBinary then
ReadBinaryData("ProxyEnable", UseProxy, SizeOf(LongWord)) else
begin
bUseProxy:= ReadBool("ProxyEnable");
if bUseProxy then UseProxy:= 1 else UseProxy:= 0;
end;
if (UseProxy <> 0) and (ReadString("ProxyServer") <> "" ) then Result:= 2;
end;
except
//Вероятно, нет связи через прокси
end;
finally
Free;
end;
// Мы можем проверять(отмечать) RasConnectionCount, даже если работа с сетями
// телефонного вызова не установлена просто, потому что это возвратится 0,
// если DLL не найден.
if Result = 0 then
begin
if RasConnectionCount > 0 then Result:= 1;
end;

end;


← →
DeMoN-777 ©   (2003-09-05 00:19) [1]

Если я правильно понял вопрос, то лучшей проверки, кроме пинга нет + дать возможностьь юзверю настроить проксю. Остальные способы сомнительны и в них есть свои "подводные камни". Вопрос поднимался сотни раз, но конкретного ответа я лично так и не наблюдал... самому интерестно. Как ? Сошлись на пинге.


← →
Вася Пупкин ©   (2003-09-05 00:59) [2]

> DeMoN-777 © (05.09.03 00:19) [1]
Не сказал бы... у меня на работе пинг наружу не проходит... админы позаботились


← →
nikkie ©   (2003-09-05 01:11) [3]

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


← →
Verg ©   (2003-09-05 08:12) [4]

Че-то я не понял. Ты что называешь подключением к Инет-у?
Наличие в регистри каких-то там настроек прокси?

А что, без прокси уже в инет не ходят?
Бред какой-то...

А RAS соединения могут быть установлены и вовсе не к провайдеру глобальной сети.

Соединение с Интернет - это некорректный термин. Единственное о чем можно говорить - это "возможен ли диалог с нужным хостом-участником глобальной сети".


← →
lipskiy ©   (2003-09-05 08:23) [5]

Приведенный код дает ответ 0 в случае отсутствия соединения, 1 в случае соединения через прокси, и 2 в случае модемного соединенния, я так его понял.
Ну ясно, вполне убедили что лучше пинговать, тем более что почти все это советуют.

Может кто подскажет тогда, как пропинговать конкретный сервер? Или может где есть примерчик?


← →
Verg ©   (2003-09-05 08:38) [6]

Приведенный код дает ответ 0 в случае отсутствия соединения, 1 в случае соединения через прокси, и 2 в случае модемного соединенния, я так его понял.

Нет, этот код даст 2, если ИЕ сконфигурирован на работу через прокси.
Он даст 1, если прокси не сконфигурирован, но есть хоть одно RAS соединение (любое, хоть с кем).

И он даст 0 в случае, когда нет ни одного RAS соединения, да и ИЕ сконфигурирован на работу без прокси.


> Ну ясно, вполне убедили что лучше пинговать


Не, не то. Если комп сидит в теневой сети и может выходить ТОЛЬКО через прокси никакой пинг ему не поможет. В лучшем случае с помощью PING он может проверить <жив ли>/<не заблокирован ли ICMP на> компътер, на котором должен работать прокси.


← →
Verg ©   (2003-09-05 08:49) [7]

Чуть ниже по экрану :)

http://delphimaster.net/view/6-1062705478/



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

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



Память: 0.47 MB
Время: 0.018 c
1-98701
WondeRu
2003-10-21 10:32
2003.10.30
Разрушительный сбой


1-98593
XenonXX
2003-10-20 03:58
2003.10.30
Ищу Glow Label с центрированием


3-98497
_Agent_
2003-10-10 20:02
2003.10.30
Ошибка при закрытии TADOStoredProc .


1-98617
diww
2003-10-17 15:08
2003.10.30
почему ругается на объвление функции?


1-98620
RoLeX
2003-10-17 14:41
2003.10.30
Как сделать, чтобы форма показывалась поверх всех окон???




   Наверх