Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Наличие связи


Автор: MacTep 11.3.2008, 08:05
Как на 100% (ну или хотя бы на 99%) проверить, есть ли у данного компьютера в данный момент времени связь с интернет. И не важно, как подключается комп к сети (диал ап, выделенка, wi-fi, с прокси сервером или нет). Есть ли такой надежный вариант проверки?

Автор: greenpc 11.3.2008, 09:18
"пингануть" адрес в сети

Автор: MetalFan 11.3.2008, 14:35
... который 100%(ну или хотябы 99%) отзовется на пинг

Автор: MacTep 11.3.2008, 15:52
Пингануть не так-то уж и просто, господа присяжные заседатели. ;)

Автор: MetalFan 11.3.2008, 16:12
а в чем собсно сложность? idIcmpClient не подходит?

Автор: MacTep 12.3.2008, 07:45
Парни, ну неужели писал бы сюда вопрос, если бы знал как. Подскажи более подробно, если знаешь.

Автор: Alix 12.3.2008, 12:11
Выдержка из статьи в DelphiWorld:
Цитата
Функция InternetGetConnectedState() 

Чтобы удостоверится в бесполезности этой функции для наших целей, достаточно посмотреть ее описание в MSDN: 

"You cannot rely solely on the fact that InternetGetConnectedState returning TRUE means that you have a valid active Internet connection. It is impossible for InternetGetConnectedState to determine if the entire connection to the Internet is functioning without sending a request to a server. This is why you need to send a request to determine if you are really connected or not. You can be assured however that if InternetGetConnectedState returns TRUE, that attempting your connection will NOT cause you to be prompted to connect to the default Internet Service Provider." 

Единственно полезным в этой функции является то, что если уж она и возвратила TRUE, то при попытке соединения с Интернет вам не будет предлагаться сначала подключиться к нему. 


Поэтому рекомендую вызвать ее и если она возвратила true, вызвать следующую функцию (цитата из msdn):
Цитата
InternetCheckConnection
Allows an application to check if a connection to the Internet can be established.

BOOL InternetCheckConnection(
  LPCTSTR lpszUrl,
  DWORD dwFlags,
  DWORD dwReserved
);

Parameters
lpszUrl 
[in] Pointer to a null-terminated string that specifies the URL to use to check the connection. This value can be NULL. 
dwFlags 
[in] Options. FLAG_ICC_FORCE_CONNECTION is the only flag that is currently available. If this flag is set, it forces a connection. A sockets connection is attempted in the following order:
  If lpszUrl is non-NULL, the host value is extracted from it and used to ping that specific host. 
  If lpszUrl is NULL and there is an entry in the internal server database for the nearest server, the host value is extracted from the entry and used to ping that server. 
dwReserved 
[in] Reserved. Must be zero. 
Return Values
Returns TRUE if a connection is made successfully, or FALSE otherwise. Use GetLastError to retrieve the error code. ERROR_NOT_CONNECTED is returned by GetLastError if a connection cannot be made or if the sockets database is unconditionally offline.

Автор: MIX55 12.3.2008, 12:52
Вот компонент http://www.torry.net/quicksearchd.php?String=XNetDetect&Title=Yes

Цитата

NetDetect is a non-visual Delphi component being able to keep your application informed about any change of the Internet connectivity status. If you want to handle the event when your PC connects/disconnects from the Internet, XNetDetect is for you. The new version comes with a new strategy of detecting internet connectivity.


У меня на Dual-up определяет  100% (ну или 99 % кому как  smile )

P.S. Отпишитесь кто проверял на других типах соединений

Автор: Alix 12.3.2008, 13:18
в этом компоненте используется следующая функция:
Код
function IsConnectedToInternet(host: string; timeOut: Cardinal): boolean;
var hInet, hInetUrl: Pointer;
begin
  Result := false;
  hInet := InternetOpen('XNetDetect v2.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, @timeOut, sizeOf(timeOut));
    hInetUrl := InternetOpenUrl(hInet,
                                PChar(host),
                                nil,
                                0,
                                INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE or
                                INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT,
                                0);
    if Assigned(hInetUrl) then
    begin
      InternetCloseHandle(hInet);
      Result := true;
    end
    else
      InternetCloseHandle(hInet);
  except
    InternetCloseHandle(hInet);
  end;
end;

вызывается она там из потока, чтобы предотвратить зависание основного потока на время соединения. Результат проверки доступен, как я понял, потом по событию OnConnectionStatus. Также в компоненте есть таймер, так что проверка может осуществляться с заданной периодичностью. При изменении статуса происходит событие OnConnectionStatusChanged. Мое мнение, что если проверка нужна всего один раз, то такой компонент - излишество. Особенно, если пишется приложение без vcl, т.к. компонент его активно использует.

Автор: MacTep 12.3.2008, 15:56
Спасибо за исчерпывающий ответ всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)