Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

l.a_ ©   (2004-11-20 12:05:00) 

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


Piter   (2004-11-20 22:09:00) [1]

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


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

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


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

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


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


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


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


Anatoly Podgoretsky   (2004-11-20 19:55:00) [4]

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

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


Piter   (2004-11-20 19:52:00) [5]

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


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


Piter   (2004-11-20 19:50:00) [6]

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


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

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


Anatoly Podgoretsky   (2004-11-20 19:48:00) [7]

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


Verg   (2004-11-20 19:47:00) [8]


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


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

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


Piter   (2004-11-20 19:33:00) [9]

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


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


Verg   (2004-11-20 19:18:00) [10]


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


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


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

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


Piter   (2004-11-20 18:14:00) [12]

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


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

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

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


Anatoly Podgoretsky   (2004-11-20 15:46:00) [13]

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


Verg   (2004-11-20 15:39:00) [14]

Ну, одним словом, кроме понятия присутствия 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.


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

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


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


Anatoly Podgoretsky   (2004-11-20 15:35:00) [16]

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


Piter   (2004-11-20 15:34:00) [17]

Sicilla ©   (20.11.04 15:01) [3]

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


Anatoly Podgoretsky   (2004-11-20 15:14:00) [18]

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


Sicilla   (2004-11-20 15:01:00) [19]

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо