Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Как узнать, что комп подклю чился к интернету?   Найти похожие ветки 

 
l.a_ ©   (2004-11-20 12:05) [0]

Как узнать, что комп подклю чился к интернету?


 
VMcL ©   (2004-11-20 12:33) [1]

Для начала нужно определиться с понятием "подключился к интернету".


 
Piter ©   (2004-11-20 14:55) [2]

Ага, даже так - надо определиться с понятием "интернет" - что это такое?


 
Sicilla ©   (2004-11-20 15:01) [3]

Просто надо посмотреть на tray, и запустить у себя таймер на часах


 
Anatoly Podgoretsky ©   (2004-11-20 15:14) [4]

Piter ©   (20.11.04 14:55) [2]
С этим нет проблем, Интернет (Сеть) это сеть сетей.


 
Piter ©   (2004-11-20 15:34) [5]

Sicilla ©   (20.11.04 15:01) [3]

правда? А вот у меня в трее горит значок подключения к локальной сети. Это как, считается теперь что я в интернете?


 
Anatoly Podgoretsky ©   (2004-11-20 15:35) [6]

Нет это подключение к локальной сети


 
Piter ©   (2004-11-20 15:36) [7]

Anatoly Podgoretsky ©   (20.11.04 15:14) [4]
С этим нет проблем, Интернет (Сеть) это сеть сетей


каких сетей? Вот моя локальная сеть является интернетом?


 
Verg ©   (2004-11-20 15:39) [8]

Ну, одним словом, кроме понятия присутствия Default GateWay у компа ничего пока на ум не приходт. Хотя можно пробовать отпрвить "почту на чистом Delphi" и если это удасться, то комп скорее в Интернете, чем вне его :)

Насчет Default GateWay. Игрушка:

program BestInt;

{$APPTYPE CONSOLE}

uses
 Windows,
 WinSock,
 SysUtils, WinInet;

const
 MAX_INTERFACE_NAME_LEN  = 256;
 MAX_TRANSPORT_NAME_LEN  = 40;
 MAX_MEDIA_NAME          = 16;
 MAX_PORT_NAME           = 16;
 MAX_DEVICE_NAME         = 128;
 MAX_PHONE_NUMBER_LEN    = 128;
 MAX_DEVICETYPE_NAME     = 16;
 MAXLEN_IFDESCR          = 256;
 MAXLEN_PHYSADDR         = 8;

 MIB_IF_TYPE_OTHER              = 1;
 MIB_IF_TYPE_ETHERNET           = 6;
 MIB_IF_TYPE_TOKENRING          = 9;
 MIB_IF_TYPE_FDDI               = 15;
 MIB_IF_TYPE_PPP                = 23;
 MIB_IF_TYPE_LOOPBACK           = 24;
 MIB_IF_TYPE_SLIP               = 28;

type
   TMIB_IFROW = record
           wszName : array[0..MAX_INTERFACE_NAME_LEN-1] of widechar;
           dwIndex,
           dwType,
           dwMtu,
           dwSpeed,
           dwPhysAddrLen : DWORD;
           bPhysAddr : array[0..MAXLEN_PHYSADDR-1] of BYTE;
           dwAdminStatus,
           dwOperStatus,
           dwLastChange,
           dwInOctets,
           dwInUcastPkts,
           dwInNUcastPkts,
           dwInDiscards,
           dwInErrors,
           dwInUnknownProtos,
           dwOutOctets,
           dwOutUcastPkts,
           dwOutNUcastPkts,
           dwOutDiscards,
           dwOutErrors,
           dwOutQLen,
           dwDescrLen : DWORD;
           bDescr : array[0..MAXLEN_IFDESCR-1] of BYTE;
end;
PMIB_IFROW = ^TMIB_IFROW;

var
 NotifyOverlapped : TOverlapped;
 IFRow : TMIB_IFROW;
 S : string;
 NFH : THandle;
 Res : DWORD;
 EndFlag : boolean;

function GetBestInterface(
 dwDestAddr : DWORD;     // destination IP address
 var pdwBestIfIndex : DWORD // index of interface with the best route
) : DWORD; stdcall; external "IPHLPAPI.DLL";

function GetIfEntry(var pIfRow : TMIB_IFROW ): DWORD; stdcall; external "IPHLPAPI.DLL";

function NotifyRouteChange(var Handle : THandle;
                          var overlapped : TOverlapped
                         ):DWORD; stdcall; external "IPHLPAPI.DLL";

function CtrlHandler(dwCtrlType : DWORD):BOOL; stdcall;
begin
 Result := BOOL(true);
 EndFlag := true;
 SetEvent(NotifyOverlapped.hEvent);
end;

function ToOem(const S : string):string;
begin
 Result := S;
 if Result<>"" then
   CharToOemBuff(pchar(Result), pchar(Result), length(Result));
end;

procedure PrintErr(Err : DWORD; Wt : boolean);
begin
 Writeln(ToOem(SysErrorMessage(Err)));
 if Wt then ReadLn;
end;

procedure CheckResult( Res : DWORD);
begin
 if Res <> NO_ERROR then
 begin
   PrintErr(Res, true);
   halt(0);
 end;
end;

begin
 Writeln(S);
 ZeroMemory(@NotifyOverLapped, sizeof(NotifyOverLapped));
 NotifyOverLapped.hEvent := CreateEvent(nil, true, false, nil);
 EndFlag := false;
 SetConsoleCtrlHandler(@CtrlHandler, LongBool(TRUE));
 repeat
   ZeroMemory(@IFRow, sizeof(IFRow));
   if GetBestInterface(INADDR_ANY, IFRow.dwIndex ) <> NO_ERROR then
     writeln(ToOem("Default gateway отсутствует"))
   else begin
      CheckResult( GetIfEntry(IFRow) );
      case IFRow.dwType of
        MIB_IF_TYPE_OTHER     : S:= "OTHER";
        MIB_IF_TYPE_ETHERNET  : S:= "ETHERNET";
        MIB_IF_TYPE_TOKENRING : S:= "TOKENRING";
        MIB_IF_TYPE_FDDI      : S:= "FDDI";
        MIB_IF_TYPE_PPP       : S:= "PPP";
        MIB_IF_TYPE_LOOPBACK  : S:= "LOOPBACK";
        MIB_IF_TYPE_SLIP      : S:= "SLIP";
      else
        S:="UNKNOWN"
      end;
      writeln(ToOem("Default gateway доступен через интерфейс типа "+S)," (",IFRow.dwSpeed,"bps)");
   end;
   Res := NotifyRouteChange(NFH, NotifyOverlapped);
   if Res <> ERROR_IO_PENDING then
     CheckResult( Res );
   if not EndFlag then
   if WaitForSingleObject(NotifyOverlapped.hEvent, INFINITE) <> WAIT_OBJECT_0 then
   begin
     PrintErr(GetLastError, true);
     break;
   end;
 until EndFlag;
 Closehandle(NotifyOverlapped.hEvent);
 Writeln("Game over");
end.


 
Anatoly Podgoretsky ©   (2004-11-20 15:46) [9]

Piter ©   (20.11.04 15:36) [7]
Нет поскольку она олна, то она не может быть Inter, а только Net
Более того, если есть более одной взаимодействующей локальной сети, то тоже не Inter, а Intra


 
Piter ©   (2004-11-20 18:14) [10]

Anatoly Podgoretsky ©   (20.11.04 15:46) [9]
Нет поскольку она олна, то она не может быть Inter, а только Net
Более того, если есть более одной взаимодействующей локальной сети, то тоже не Inter, а Intra


ок. А вот моя локальная сеть через роутер соединена с другой локальной сетью. А в той локальной сети есть NAT, который одним своим интерфейсом подключен к роутеру компании tochka.ru - при этом пропускает этот роутер только IP пакеты с портом назначения 80. Так что - я в интернете или нет? И моя локальная сеть является частью интернета или как?

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

Нужно просто следить за списком доступных интерфейсов - если там произошло какое-то изменение - попытаться достучаться до своего сайта/сервера. Получится - сделать то, что нужно. Не получилось - дальше отслеживать. При этом неважно есть ли доступ к "интернету" или нет. Возможно, доступ есть, но твой сайт в дауне, для программы это аналогично тому, что интернета нету, потому что весь интернет сошелся для нее только на одном сервере. Или например, выхода нет, но  нужный сервер распологается в локальной сети какого-то хостер-провайдера... Варианты различны, перебирать их не имеет смысла. Нужно просто попытаться обратиться туда, куда хочешь. Признаком того, что стоит сделать очередную попытку в частности является добавление нового интерфейса. Хотя и это не панацея, допустим в сети может быть прокси, который не работат - соответственно "интернета" нет. А тут пришел админ и починил прокси - интернет появился, да только на клиенте это никак прочувствовать невозможно, пока не попробуешь. Тут наверное только можно по таймеру предложить опрашивать...


 
Anatoly Podgoretsky ©   (2004-11-20 19:11) [11]

Как только тебе доступны ресурсы из глобальной Сети, так сразу можешь говорить, что у тебя есть соединение с ней. И определяется это не через какое то мифическое соединение, а именно через доступность ресурсов глобальной сети. Частный случай когда скажем доступен только один ресурс, скажем одна единственная страница, а у меня есть такие рабочие места, с которых доступен только один единственный сайт. То есть доступ есть но толькло до одного ресурса. И о какой проверки речь не может идти, поскольку если подключение идет через локальную сеть или прокси, то считается что подключение постоянное и нечего проверять, а в случае с модемом тоже нельзя говорить о подключении к Интернет, а только о подключение к локальной сети провайдера или его маршрутизатору, а далее все то, что сказал про ресурсы. И только в одном случае можно говорить о подключении к Сети, это когда она напрямую подключается к единственному комьютеру, в этом случае имеется глобальный, а не локальный адрес. Все остальное от лукавого.


 
Verg ©   (2004-11-20 19:18) [12]


> [10] Piter ©   (20.11.04 18:14)


Знал бы ты СКОЛЬКО перетерто по этому поводу, на этом сайте, в этом только форуме на ЭТУ тему.
При виде вопроса "Как опредлить, что подключен к Интернету" у многих завсегдатаев начинаются спазмальгические реакции (кроме все остальных, типа изжога и т.п.), граничащие с истерическим нервным хохотом.... заканчивающиеся, как правило в последнее время, гробовым молчанием...


 
Piter ©   (2004-11-20 19:33) [13]

Verg ©   (20.11.04 19:18) [12]
Знал бы ты СКОЛЬКО перетерто по этому поводу, на этом сайте, в этом только форуме на ЭТУ тему


почему ты считаешь, что я не знаю? Я на этом сайте года три где-то... не меньше


 
Verg ©   (2004-11-20 19:47) [14]


> [13] Piter ©   (20.11.04 19:33)
> почему ты считаешь, что я не знаю? Я на этом сайте года
> три где-то... не меньше


Ну что, начнем в "лучших традициях"?
Типа, а почему ты считаешь., что я считаю, что ты считаешь....?

Сказочку про белого бычка....?


 
Anatoly Podgoretsky ©   (2004-11-20 19:48) [15]

Piter ©   (20.11.04 19:33) [13]
Ну тогда ты провокатор :-)


 
Piter ©   (2004-11-20 19:50) [16]

Anatoly Podgoretsky ©   (20.11.04 19:11) [11]
Как только тебе доступны ресурсы из глобальной Сети, так сразу можешь говорить, что у тебя есть соединение с ней


хм. Ок, так вот если сайт www.some.ru находится в локальной сети моего провайдера, к которой я имею доступ, но из-за неоплаты отключен от прокси сервера провайдера... в данной ситуации можно считать что я подключен к интернету?

То есть, я имею доступ к одному сайту и по вашей логике можно считать, что я подключен к интернету?!


 
Piter ©   (2004-11-20 19:52) [17]

Verg ©   (20.11.04 19:47) [14]
Ну что, начнем в "лучших традициях"?
Типа, а почему ты считаешь., что я считаю, что ты считаешь....?


чего ты завелся? Я просто уточних, что хорошо знаю насколько часто этот вопрос поднимается здесь...


 
Anatoly Podgoretsky ©   (2004-11-20 19:55) [18]

Просто есть две сети

сеть и Сеть, так вот первая это локальная, а вторая это Сеть (если говорить по английски, они ее так называют, с большой буквы).


 
Verg ©   (2004-11-20 19:56) [19]


> [17] Piter ©   (20.11.04 19:52)
> Verg ©   (20.11.04 19:47) [14]
> Ну что, начнем в "лучших традициях"?
> Типа, а почему ты считаешь., что я считаю, что ты считаешь....?
>
> чего ты завелся?


Да сегодня-то, я спокоен КАК Удав :))


 
Anatoly Podgoretsky ©   (2004-11-20 20:02) [20]

Anatoly Podgoretsky ©   (20.11.04 19:55) [18]
Может не совсем понятно, не все знают английский
internet и Internet


 
Piter ©   (2004-11-20 22:09) [21]

Anatoly Podgoretsky ©   (20.11.04 19:55) [18]
Просто есть две сети


Понимаю. Но вы не ответили на вопрос:

Piter ©   (20.11.04 19:50) [16]
То есть, я имею доступ к одному сайту и по вашей логике можно считать, что я подключен к интернету?!



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

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.061 c
1-1105772482
Александр1
2005-01-15 10:01
2005.02.06
Работа с Word


6-1101327410
Жуков
2004-11-24 23:16
2005.02.06
Отправка сообщений по локальнй сети


9-1099395514
Sphinx
2004-11-02 14:38
2005.02.06
Заголовочные файлы DX


3-1104820506
YurikGL
2005-01-04 09:35
2005.02.06
Автоподстановка из родительской таблицы


1-1106489448
Aleks
2005-01-23 17:10
2005.02.06
Долгое выполнение программы или разграничение процессов