Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для Hardalternative
3 / 3 / 0
Регистрация: 30.01.2018
Сообщений: 415
RAD XE3+

Проверка подключения к интернету

06.09.2023, 21:17. Показов 2055. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется данный код что работает. То есть даже если включен VPN то проверка идет как нужно.

Вопрос в следующем: Что означают параметры $00000001 и 0.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  dwConnectionTypes: DWORD;
begin
  if not(InternetCheckConnection('http://microsoft.com', $00000001, 0) = true)
  then
  begin
    Showmessage('Нет подключения к интернету.');
  end
  else
  begin
    Showmessage('Есть подключения к интернету.');
  end;
end;
Мне нужно проверить в принципе подключен компьютер к интернет или нет (а не к конкретному сайту). То есть если через VPN подключен или WIFI и так далее.

Если адрес сайта заменить на параметр nil то неправильно работает функция.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2023, 21:17
Ответы с готовыми решениями:

Проверка подключения к интернету не работает
Использую вот такую штуку: Try IdHTTP1.Get( 'http://yandex.ru' ); InetConnection := True; Except InetConnection := False; ...

Проверка подключения к интернету
как проверить подключение к интернету? Добавлено через 22 минуты try IdHTTP1.Get('http://ya.ru'); except ShowMessage('Нет...

Как отловить сообщение об отсутствии подключения к интернету?
Всем привет. Скачиваю файлы через поток и пользуюсь блоками try...except. Но вот хочу сообщение об отсутствии интернета отдельно вывести не...

26
Злостный нарушитель
 Аватар для Verevkin
10886 / 5822 / 1288
Регистрация: 12.03.2015
Сообщений: 26,882
11.09.2023, 21:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Hardalternative Посмотреть сообщение
А вот пинговать, правильно ли я делаю
Не знаю.

1
 Аватар для Hardalternative
3 / 3 / 0
Регистрация: 30.01.2018
Сообщений: 415
11.09.2023, 21:24  [ТС]
Verevkin, Решил вопрос, проще некуда . Есть готовый код. Создал файл Ping.pas и в него код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
unit Ping;
 
interface
 
function PingHost(const HostName: AnsiString; TimeoutMS: cardinal = 500): boolean;
 
implementation
 
uses Windows, SysUtils, WinSock;
 
function IcmpCreateFile: THandle; stdcall; external 'iphlpapi.dll';
function IcmpCloseHandle(icmpHandle: THandle): boolean; stdcall;
  external 'iphlpapi.dll';
function IcmpSendEcho(icmpHandle: THandle; DestinationAddress: In_Addr;
  RequestData: Pointer; RequestSize: Smallint; RequestOptions: Pointer;
  ReplyBuffer: Pointer; ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall;
  external 'iphlpapi.dll';
 
type
  TEchoReply = packed record
    Addr: In_Addr;
    Status: DWORD;
    RoundTripTime: DWORD;
  end;
 
  PEchoReply = ^TEchoReply;
 
var
  WSAData: TWSAData;
 
procedure Startup;
begin
  if WSAStartup($0101, WSAData) <> 0 then
    raise Exception.Create('WSAStartup');
end;
 
procedure Cleanup;
begin
  if WSACleanup <> 0 then
    raise Exception.Create('WSACleanup');
end;
 
function PingHost(const HostName: AnsiString;
  TimeoutMS: cardinal = 500): boolean;
const
  rSize = $400;
var
  e: PHostEnt;
  a: PInAddr;
  h: THandle;
  d: string;
  r: array [0 .. rSize - 1] of byte;
  i: cardinal;
begin
  Startup;
  e := gethostbyname(PAnsiChar(HostName));
  if e = nil then
    RaiseLastOSError;
  if e.h_addrtype = AF_INET then
    Pointer(a) := e.h_addr^
  else
    raise Exception.Create('Name doesn''t resolve to an IPv4 address');
 
  d := FormatDateTime('yyyymmddhhnnsszzz', Now);
 
  h := IcmpCreateFile;
  if h = INVALID_HANDLE_VALUE then
    RaiseLastOSError;
  try
    i := IcmpSendEcho(h, a^, PChar(d), Length(d), nil, @r[0], rSize, TimeoutMS);
    Result := (i <> 0) and (PEchoReply(@r[0]).Status = 0);
  finally
    IcmpCloseHandle(h);
  end;
  Cleanup;
end;
 
end.

Подключаю в Uses Ping и использую вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.button1Click(Sender: TObject);
begin
try
  if PingHost('8.8.8.8') then
    ShowMessage('Есть интернет')
  else
    ShowMessage('Нет интернета');
except
 ShowMessage('Нет интернета');
end;
end;
0
Злостный нарушитель
 Аватар для Verevkin
10886 / 5822 / 1288
Регистрация: 12.03.2015
Сообщений: 26,882
11.09.2023, 21:30
Цитата Сообщение от Hardalternative Посмотреть сообщение
Решил вопрос, проще некуда
Ну ладно. Я спать пошёл.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
11.09.2023, 22:59
Цитата Сообщение от robt Посмотреть сообщение
https://yandex.ru не корректный
Да, с некоторых пор некорректный. С него идёт редир на dzen.ru.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
12.09.2023, 02:16

Не по теме:

Цитата Сообщение от AzAtom Посмотреть сообщение
Да, с некоторых пор некорректный. С него идёт редир на dzen.ru.
Угу. Чтоб их всех приподняло да хлопнуло!
Этот Дзен уже достал.

0
12.09.2023, 08:45

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
Угу. Чтоб их всех приподняло да хлопнуло!
Этот Дзен уже достал.
(подсказываю) туда можно не ходить))))

0
 Аватар для Hardalternative
3 / 3 / 0
Регистрация: 30.01.2018
Сообщений: 415
12.09.2023, 15:40  [ТС]
Есть еще лучше вариант того кода что выше. Скорее всего короче а не лучше.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
unit Unit2;
 
interface
 
uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, WinSock;
 
  type
  ip_option_information = packed record // header of an IP packet
    // Otherwise, the route option should be formatted as specified in RFC 791
    Ttl: byte; // Time to live
    Tos: byte; // Type of service, generally 0
    Flags: byte; // IP header flags, generally 0
    OptionsSize: byte; // Size in bytes of options data, generally 0, max 40
    OptionsData: Pointer; // Pointer to options data
  end;
 
  icmp_echo_reply = packed record
    Address: u_long; // Replying address, in the form of an IPAddr structure
    Status: u_long; // Status of the echo request, in the form of an IP_STATUS code
    RTTime: u_long; // Round trip time, in milliseconds
    DataSize: u_short; // Reply data size, in bytes
    Reserved: u_short; // Reserved for system use
    Data: Pointer; // Pointer to the reply data
    Options: ip_option_information; // Reply options, in the form of an IP_OPTION_INFORMATION structure
  end;
 
  PIPINFO = ^ip_option_information;
  PVOID = Pointer;
 
function IcmpCreateFile(): THandle; stdcall;
  external 'ICMP.DLL' name 'IcmpCreateFile';
function IcmpCloseHandle(IcmpHandle: THandle): BOOL; stdcall;
  external 'ICMP.DLL' name 'IcmpCloseHandle';
function IcmpSendEcho(IcmpHandle: THandle;   // handle, returned IcmpCreateFile()
  DestAddress: u_long; // Destination IP Address
  RequestData: PVOID; // The buffer that contains the data to send in the request
  RequestSize: Word; // The size, in bytes, of the request data buffer.
  RequestOptns: PIPINFO; // A pointer to the IP header options for the request,
                         //in the form of an IP_OPTION_INFORMATION structure.
                         //May be NULL
  ReplyBuffer: PVOID; // A buffer to hold any replies to the request.
  ReplySize: DWORD; // The allocated size, in bytes, of the reply buffer.
                    // The buffer should be large enough to hold at least one
                    // ICMP_ECHO_REPLY structure plus RequestSize bytes of data.
  Timeout: DWORD // The time, in milliseconds, to wait for replies.
  ): DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';
 
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
function ping_iphost(iphost: PAnsiChar): Boolean;
var
  hIP: THandle;
  pingBuffer: array [0 .. 31] of AnsiChar;
  pIpe: ^icmp_echo_reply;
  error: DWORD;
begin
  Result := True;
  pingBuffer := 'Data Buffer';
  // Создаем дескриптор
  hIP := IcmpCreateFile();
  //Выделяет блок памяти
  GetMem(pIpe, sizeof(icmp_echo_reply) + sizeof(pingBuffer));
  try
    // Отправляет запрос ICMP Echo и возвращает все ответы
    IcmpSendEcho(hIP, inet_addr(iphost), @pingBuffer,
      sizeof(pingBuffer), Nil, pIpe, sizeof(icmp_echo_reply) +
      sizeof(pingBuffer), 1000);
    // Возвращает последнюю ошибку, о которой сообщил вызов API операционной системы
    error := GetLastError();
    if (error <> 0) then
    begin
      Result := False;
    end;
  finally
    //Закрывает дескриптор, открытый вызовом IcmpCreateFile
    IcmpCloseHandle(hIP);
  // прекращает использование WS2_32.DLL
    WSACleanup();
// Освобождает блок памяти, ранее выделенный с помощью GetMem
    FreeMem(pIpe);
  end;
end;
 
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  // проверка интернет-соединения
  // функция ping_iphost(IP_HOST): TRUE — интернет включен, FALSE — интернет выключен
  // отправил эхо-ответ ICMP
  if ping_iphost('8.8.8.8') then
    ShowMessage('Есть интернет.')
  else
    ShowMessage('Нет интернета.')
end;
end.
Получается этот вариант работает быстрее того что я выше скинул.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.09.2023, 15:40

Проверка подключения к интернету
Приветствую) Проверка зареган пользователь на сервере или нет private void Awake() { ...

Проверка подключения к интернету
Проблема такая мне нужно проверить подключен ли интернет через VBS или bat если да то запустить программу для теста...

Проверка наличия подключения к Интернету
Надо узнать есть ли соединение с интернетом. Подойдет любой способ с ping или с другим (если такие существует), можно даже через другую...

Проверка подключения к Интернету в Android Studio
Всем привет. Пишу приложение, которое работает через Интернет. Нашёл на просторах код, который проверяет подключение к сети, НО не к...

Проверка подключения к интернету. Почему Exception игнорируется?
Подскажите пожалуйста кто знает...отправляю емаил без инета, все равно пишет что сообщение ушло...вот код... private class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru