Цитата Limonica:
Как определить за NAT находится пк или нет с помощью NSIS? »
|
Вы хотите решение в 1 строчку кода?
Я, например, не шарю в сетевых технологиях и чтобы понять, чего вы действительно хотите от кода - я перед написанием кода должен проштудировать документацию относительно вашего вопроса и только после этого понять, какой функционал необходим в коде
Если готового плагина/решения нет на сайте NSIS - то я должен буду сначала понять, что такое NAT и понять, что нужно для того, чтобы приступить к написанию кода к определению за NAT/не за NAT, а это дополнительное потраченное время, лично для меня это время будет потрачено зря, т.к. мне эта тема не интересна
Так вот что хотелось бы сказать в итоге (и, думаю, нужно внести эти "пожелания-инструкции" в шапку в каком-нибудь более понятном формате, если я не очень грамотно выражусь сейчас):
Если вы просите помощи в написании кода, описывайте подробно, какие команды необходимо видеть в коде, т.к. не все мы тут супер-мега-опытные-знающие всё обо всём в мире IT, сократите время ожидания кода себе и уважайте время тех, кто вам помогает.
Например, по вашему вопросу можно было бы составить сообщение типа такого (опять же, если я всё правильно понял про NAT, прочитав инфу в инете):
Скрытый текст
Как определить за NAT находится пк или нет с помощью NSIS? Если готового решения нет, то необходим следующий функционал:
1. Определить IP адрес локальной машины
2. Определить, входит ли этот адрес в диапазоны локальных зарезервированных сетей типа 192.168.255.255, 10.255.255.255 и бла бла бла перечисляем дальше
Т.е. по сути, нам что нужно, определить это? Если IP адрес компьютера входит в диапазон локальных сетей, то мы за NAT?
Если я всё правильно понял, то можно реализовать так (или не так, если я всё-таки нифига не понял

):
В любом случае, может быть, код кому-нибудь пригодится, если это не решение вашего вопроса)
Код:

Name "GetIP Test"
OutFile "GetIP Test.exe"
Function .onInit
call GetIP
quit
FunctionEnd
Function GetIP
System::Alloc 400
pop $R0
System::Call 'ws2_32::WSAStartup(i 0x202, i R0)'
System::Call 'ws2_32::gethostname(t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
System::Call 'ws2_32::gethostbyname(t "$0") i.R1'
System::Call '*$R1(&v12,*i.R2)'
System::Call '*$R2(i.R3)'
System::Call 'ws2_32::inet_ntoa(i R3) t.R4'
System::Call 'ws2_32::WSACleanup()'
System::Free $R0
; $0 - имя хоста
; $R4 - IP адрес
Push '$R4'
Call CheckIP
Pop $0
; в $0 результат, смотрим инфу ниже:
; 1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet).
; 2 - Automatic Private IP Address (no DHCP server).
; 3 - Network IP.
; 4 - Internet IP.
StrCpy $1 "Мы за NAT"
StrCmp $0 "4" 0 +2
StrCpy $1 "Мы не за NAT"
MessageBox MB_OK|MB_ICONINFORMATION "IP - $R4$\noutput - $0$\n$\n$1"
FunctionEnd
Function CheckIP
Exch $0
Push $1
; Check 127.x.x.x
Push '127.0.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range1 ; IP cannot be in range of LoopBack addresses
Push '127.255.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LoopBack ; We found a LoopBack IP
; Check 10.x.x.x
Range1:
Push '10.0.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range2 ; IP cannot be in range 1
Push '10.255.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 172.16.x.x to 172.31.x.x
Range2:
Push '172.16.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range3 ; IP cannot be in range 2
Push '172.31.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 192.168.x.x
Range3:
Push '192.168.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range4 ; IP cannot be in range 3
Push '192.168.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 169.254.x.x
Range4:
Push '169.254.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' InternetIp ; It should be an internet IP
Push '169.254.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 APA ; We found an Automatic Private IP Address
Goto InternetIp ; Remaining addresses are internet IPs
LoopBack:
StrCpy $1 1
Goto Exit
APA:
StrCpy $1 2
Goto Exit
LanIp:
StrCpy $1 3
Goto Exit
InternetIp:
StrCpy $1 4
Exit:
Exch $1
Exch 1
Exch $0
Exch 1
FunctionEnd
Function VersionCheck
Exch $0 ;second versionnumber
Exch
Exch $1 ;first versionnumber
Push $R0 ;counter for $0
Push $R1 ;counter for $1
Push $3 ;temp char
Push $4 ;temp string for $0
Push $5 ;temp string for $1
StrCpy $R0 "-1"
StrCpy $R1 "-1"
Start:
StrCpy $4 ""
DotLoop0:
IntOp $R0 $R0 + 1
StrCpy $3 $0 1 $R0
StrCmp $3 "" DotFound0
StrCmp $3 "." DotFound0
StrCpy $4 $4$3
Goto DotLoop0
DotFound0:
StrCpy $5 ""
DotLoop1:
IntOp $R1 $R1 + 1
StrCpy $3 $1 1 $R1
StrCmp $3 "" DotFound1
StrCmp $3 "." DotFound1
StrCpy $5 $5$3
Goto DotLoop1
DotFound1:
Strcmp $4 "" 0 Not4
StrCmp $5 "" Equal
Goto Ver2Less
Not4:
StrCmp $5 "" Ver2More
IntCmp $4 $5 Start Ver2Less Ver2More
Equal:
StrCpy $0 "0"
Goto Finish
Ver2Less:
StrCpy $0 "1"
Goto Finish
Ver2More:
StrCpy $0 "2"
Finish:
Pop $5
Pop $4
Pop $3
Pop $R1
Pop $R0
Pop $1
Exch $0
FunctionEnd
Section
SectionEnd