Определение состояния подключения к сети на Ассемблере
Определение состояния подключения к сети на Ассемблере
Вдогонку к недавней статье. Если вы разрабатываете приложение, которое должно работать с какими-то данными в интернете, всегда будет полезно знать, есть ли у компьютера подключение к сети и разрешен ли приложению выход в сеть. В этих ваших интернетах приводят несколько способов решения задачи, но, как и йогурты из рекламы, не все они одинаково полезны. Давайте разберемся, какие функции стоит использовать на практике, а какие нет.
Первый способ основан на получении количества подключений к удаленному серверу с помощью функции RasEnumConnections. Этот способ работает только с модемным подключением, которое в наше время безнадежно устарело и почти нигде не встречается. При подключении через беспроводную или локальную сеть результат функции всегда будет неправильным. Этот способ можно использовать только для того, чтобы определить факт модемного соединения, но не для определения состояния подключения к сети.
Code (Assembler) : Убрать нумерацию
- ; Проверка подключения через RasEnumConnections
- mov [tmp],0
- mov [tmp2],0
- invoke RasEnumConnections,NULL,tmp,tmp2
- cmp [tmp2],0
- je no_internet_connection
Code (Assembler) : Убрать нумерацию
- ; Проверка подключения через InetIsOffline
- invoke InetIsOffline,NULL
- cmp eax,TRUE
- je no_internet_connection
Code (Assembler) : Убрать нумерацию
- szUrl db 'https://yandex.ru',0
- ...
- ...
- ; Проверка подключения через InternetCheckConnection
- FLAG_ICC_FORCE_CONNECTION = 1
- invoke InternetCheckConnection,szUrl,FLAG_ICC_FORCE_CONNECTION,NULL
- cmp eax,FALSE
- je no_internet_connection
Code (Assembler) : Убрать нумерацию
- ; Проверка подключения через InternetGetConnectedState
- invoke InternetGetConnectedState,tmp,NULL
- cmp eax,FALSE
- je no_internet_connection
Code (Assembler) : Убрать нумерацию
- ; Проверка подключения через IsNetworkAlive
- invoke IsNetworkAlive,tmp
- cmp [tmp],0
- je no_internet_connection
Code (Assembler) : Убрать нумерацию
- ; GUID {DCB00C01-570F-4A9B-8D69-199FDBA5723B}
- CLSID_NetworkListManager dd 0DCB00C01h
- dw 0570Fh
- dw 04A9Bh
- db 08Dh, 069h, 019h, 09Fh, 0DBh, 0A5h, 072h, 03Bh
- ; GUID {DCB00000-570F-4A9B-8D69-199FDBA5723B}
- IID_INetworkListManager dd 0DCB00000h
- dw 0570Fh
- dw 04A9Bh
- db 08Dh, 069h, 019h, 09Fh, 0DBh, 0A5h, 072h, 03Bh
- ; IID_INetworkListManager Interface
- struct INetworkListManager
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; INetworkListManager
- GetTypeInfoCount dd ? ; 00Ch
- GetTypeInfo dd ? ; 010h
- GetIDsOfNames dd ? ; 014h
- _Invoke dd ? ; 018h
- GetNetworks dd ? ; 01Ch
- GetNetwork dd ? ; 020h
- GetNetworkConnections dd ? ; 024h
- GetNetworkConnection dd ? ; 028h
- get_IsConnectedToInternet dd ? ; 02Ch
- get_IsConnected dd ? ; 030h
- GetConnectivity dd ? ; 034h
- SetSimulatedProfileInfo dd ? ; 038h
- ClearSimulatedProfileInfo dd ? ; 03Ch
- ends
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
Code (Assembler) : Убрать нумерацию
- invoke CoInitialize,NULL
- ; Создать объект
- invoke CoCreateInstance,CLSID_NetworkListManager,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_INetworkListManager,pINLMDisp
- ; Получить состояние подключения к Интернету
- mov eax, [pINLMDisp]
- mov eax, [eax]
- stdcall dword [eax+INetworkListManager.get_IsConnectedToInternet],\
- [pINLMDisp],IsConnected
- ; Прибраться за собой
- mov eax, [pINLMDisp]
- mov eax, [eax]
- stdcall dword [eax+INetworkListManager.Release],[pINLMDisp]
- ; Удалить объект
- invoke CoUninitialize
- ; Есть подключение к Интернету?
- cmp [IsConnected],0xFFFF
- jne no_internet_connection
Просмотров: 2433 | Комментариев: 7
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(03.02.2022 в 16:41):
Пример с COM-интерфейсом добавлен, архив обновлен.
ManHunter
(03.02.2022 в 15:34):
Надо будет попробовать, спасибо за наводку
Владимир
(03.02.2022 в 15:32):
Дмитрий, добрый день, такая функция может быть альтернативой для проверки состояния подключения к сети ?
https://docs.microsoft.com/en-...edtointernet
Спасибо за статью! Всё как обычно на высшем уровне, доходчиво и подробно.
https://docs.microsoft.com/en-...edtointernet
Спасибо за статью! Всё как обычно на высшем уровне, доходчиво и подробно.
dirbeer
(05.08.2019 в 13:28):
NoNaMe, Delphi?
Андрей
(03.07.2019 в 00:05):
Воу-воу, диалап на картинке!
ManHunter
(13.05.2019 в 15:08):
NoNaMe, не совсем так. Эта функция определяет вообще ВОЗМОЖНОСТЬ подключения компа к сети, то есть наличие сетевой карты, модема, адаптера wifi и всякого подобного железа. Во всех этих случаях результат всегда будет положительный. А вот подключен комп через эти устройства к интернету или нет - это не узнать. Так что увы, не годится.
Добавил еще один способ с IsNetworkAlive.
Добавил еще один способ с IsNetworkAlive.
NoNaMe
(13.05.2019 в 14:51):
function IsInternetConnected: Boolean;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
Добавить комментарий
Заполните форму для добавления комментария