2015-06-09 3 views
0

В каком случае или как я могу проверить подключение к Интернету во время работы программы? Сценарий: программа запущена и внезапно отключается подключение к Интернету, и открывается диалоговое окно «Без доступа в Интернет, изменение строки подключения к центральной базе данных». Я пробовал эту функцию, но я не уверен, в каком событии я должен поставить так, чтобы он работал все время.Проверка подключения к Интернету во время выполнения

function TFK_Lib.CheckInternet: boolean; 
begin 
    ConnectedState := INTERNET_CONNECTION_MODEM; 
    Result := InternetGetConnectedState(@ConnectedState, 0); 
end; 
+1

Ваше предлагаемое решение не будет работать. Предположим, что соединение падает после вызова 'CheckInternet', но прежде чем вы начнете использовать соединение. Здесь есть условие гонки, которое вам нужно признать. –

+1

Функция AFAIK выше даже не даст вам текущего состояния подключения. Он будет указывать только на то, что подключение к Интернету настроено правильно, но не текущее активное/неактивное состояние. –

+3

Я думаю, что вас не интересует официальный статус в Интернете - Windows может подумать, что он подключен, но ваша программа не имеет доступа к точно вашей удаленной базе данных (удаленный сервер DB вниз, интрасеть вместо Интернета, антивирус брандмауэра блокирует ваше приложение, какая бы другая проблема). Кроме того, у вас может не быть подключения к WWW, но у вас все еще есть подключение к базе данных в Интернете. Таким образом, вам нужно только попробовать подключиться к вашей конкретной удаленной службе и сообщить любой текст ошибки, который Windows даст вам в случае сбоя. Это не интересно вашему приложению, если какой-либо Большой Интернет пользуется или нет. –

ответ

-1

Вы можете сделать практический тест и выполнить ping google.com. Если я правильно понял ваш вопрос, я думаю, что это не плохой вариант. Пример кода:

class function TAuthUserFunctions.CheckInternet: boolean; 
    var 
    idtcp : TIdTCPClient; 
    begin 
     try 
     idtcp := TIdTCPClient.Create(Nil); 
     try 
      idtcp.ReadTimeout := 2000; 
      idtcp.ConnectTimeout := 2000; 
      idtcp.Port := 80; 
      idtcp.Host := 'google.com'; 
      idtcp.Connect; 
      idtcp.Disconnect; 
      Result := True; 
     finally 
      idtcp.Free; 
     end; 
     except 
     Result := False; 
     end; 
    end; 
+3

Плохая идея! Google, конечно же, не понравится;) – whosrdaddy

+0

Ну, он все равно будет терпеть :) – Masscrits

+0

Прежде всего, Windows имеет функцию проверки соединения с определенным URL-адресом 'InternetCheckConnection', и, во-вторых, pinging Google - это в конечном счете плохая идея. –

0

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

Смежные вопросы