Форум: "Сети";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизПроверка соединения с интернетом - как гарантированно? Найти похожие ветки
← →
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 вся ветка
Форум: "Сети";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c