Kirjoittaja: sooda
Kirjoitettu: 31.07.2004 – 31.07.2004
Tagit: koodi näytille, vinkki
Nämä hakevat winsock-apeja käyttäen ip:n nimestä (kuten www.ohjelmointiputka.net) tai nimen ip:stä, kummin päin vain haluat... ärsyttävää kun vb:ssä osoittimia käsitelläkseen tarttee sikana copymemorya :P
motuuliin
Private Const AF_INET = 2
Private Const IP_SUCCESS As Long = 0
Private Const MAX_WSADescription = 256
Private Const MAX_WSASYSStatus = 128
Private Const SOCKET_ERROR As Long = -1
Private Const WS_VERSION_REQD As Long = &H101
Type HOSTENT
h_name As Long
h_aliases As Long
h_addrtype As Integer
h_length As Integer
h_addr_list As Long
End Type
Type servent
s_name As Long
s_aliases As Long
s_port As Long
s_proto As Long
End Type
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Long
wMaxUDPDG As Long
dwVendorInfo As Long
End Type
Private Declare Function inet_addr Lib "WSOCK32.DLL" (ByVal CP As String) As Long
Private Declare Function inet_ntoa Lib "WSOCK32.DLL" (ByVal LonkiIP As Long) As Long
Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" (Addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal host_name As String) As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&)
Private Declare Function lstrlen Lib "kernel32" (ByVal StringPointteriing As Any) As Integer
Public Function HaeIPNimestä(Hosti As String) As Long 'hakee ip:n (long-tyyppisen homman) nimestä (kuten www.ohjelmointiputka.net)...
Dim IppeID As Long, HostiHomma As HOSTENT
Dim addrListi As Long, Ippe As Long
If WSInittaa = False Then Exit Function 'ws:ää tarvitaan, jos ei initointi onnistu niin ei mikään
If inet_addr(Hosti) = -1 Then 'koklataan onko sitä
IppeID = gethostbyname(Hosti) 'id homma
If IppeID <> 0 Then 'jos on niin leikitään pointtereilla. c++:ssa olisi vähän helpompaa :D
CopyMemory HostiHomma, ByVal IppeID, Len(HostiHomma)
CopyMemory addrListi, ByVal HostiHomma.h_addr_list, 4
CopyMemory Ippe, ByVal addrListi, HostiHomma.h_length
End If
End If
HaeIPNimestä = Ippe
WSACleanup 'turhat ws-hommat vek
End Function
Public Function HaeNimiIPstä(ByVal HakuOsote As String) As String 'hakee nimen ip-osoitteesta
Dim HostEntti As Long
Dim Osote As Long
Dim Pituus As Long
If WSInittaa() = False Then Exit Function 'ws:ää tarvitaan tässäki, jos ei initointi onnistu niin ei mikään
Osote = inet_addr(HakuOsote) 'longhommaksi
If Osote <> SOCKET_ERROR Then
DoEvents 'doeventsiä tarttee jostain syystä, kokeilin ilman sitä muttei toiminut. funkkarit tarttee jonkun verran aikaa ihmettelemiseen
HostEntti = gethostbyaddr(Osote, 4, AF_INET) 'hostent-pointteri
DoEvents
If HostEntti <> 0 Then
CopyMemory HostEntti, ByVal HostEntti, 4 'kopsitaan hostenttiin osoittimen osoittama tieto
Pituus = lstrlen(ByVal HostEntti)
If Pituus > 0 Then
HakuOsote = Space(Pituus)
CopyMemory ByVal HakuOsote, ByVal HostEntti, Pituus 'ja osoitinleikkiä taas. yäk
HaeNimiIPstä = HakuOsote
End If
Else
HaeNimiIPstä = HakuOsote 'DNS:llä ei ole nimeä sille, eli takasi ip:ksi
End If
WSACleanup 'turhat ws-hommat vek
End If
End Function
Public Function HaeTekstiIP(ByVal LonkiIP As Long) As String 'hakee tekstisen ip:n (niinku 127.0.0.1) long-tyyppisestä iphommasta
Dim Pituus As Long
Dim StringPointteri As Long
Dim Tulos As String
Tulos = String(32, 0) 'alustetaan se
StringPointteri = inet_ntoa(LonkiIP) 'ptrejä lisää
If StringPointteri Then 'jos se löytyy
Pituus = lstrlen(StringPointteri)
If Pituus > 32 Then Pituus = 32
CopyMemory ByVal Tulos, ByVal StringPointteri, Pituus 'pointterin osoittama tieto tulokseen...
Tulos = Left(Tulos, Pituus) 'irrotetaan turhat nollatavut
HaeTekstiIP = Tulos
End If
End Function
Private Function WSInittaa() As Boolean 'wsinitointifunkkari, helpompi leikkiä tällä kun parilla ylimääräisellä dimillä
Dim WSAD As WSADATA 'pari tietoa
Dim success As Long
WSInittaa = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS 'wsinittaa on true jos wsastartup onnistuu
End Functionesimerkki käytöstä
Private Sub Form_Load()
'esimerkkihommeli
MsgBox "Ohjelmointiputkan IP: " & HaeTekstiIP(HaeIPNimestä("www.ohjelmointiputka.net")), vbInformation, "Tärkeä huomio!"
MsgBox "Tämän pitäisi olla localhost: " & HaeNimiIPstä("127.0.0.1"), vbInformation, "Tärkeä huomio!"
End
End SubTuntuu toimivan mainiosti, mukava vinkki! Mutta VB6:ssa noiden tyyppien eteen täytyy pistää sana Private, jotta koodi toimii.
Ei tartte kun sen tunkee motuuliin :)
Ai joo, olisi pitänyt seurata ohjetta. :)
Ok vinkki. Olisi tosin ehkä järkevämpää kutsua WSInittaa:ta vain kerran ohjelman alussa ja tehdä WSACleanup sitten kerran ohjelman lopussa.
VB.NETillä homma näyttäisi menevän kokonaisuudessaan näin:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
MsgBox("Ohjelmointiputkan IP: " & System.Net.Dns.GetHostByName("www.ohjelmointiputka.net").AddressList(0).ToString, vbInformation, "Tärkeä huomio!")
MsgBox("Tämän pitäisi olla localhost: " & System.Net.Dns.GetHostByAddress("127.0.0.1").HostName, vbInformation, "Tärkeä huomio!")
End
End SubKyllä vinkkiä pukkaa..
lainaus:
VB.NETillä homma näyttäisi menevän kokonaisuudessaan näin:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load MsgBox("Ohjelmointiputkan IP: " & System.Net.Dns.GetHostByName("www.ohjelmointiputka.net").AddressList(0).ToString, vbInformation, "Tärkeä huomio!") MsgBox("Tämän pitäisi olla localhost: " & System.Net.Dns.GetHostByAddress("127.0.0.1").HostName, vbInformation, "Tärkeä huomio!") End End Sub
Pläh, ihan liian helppoa :P
sama idis ku yhessä mikrobitissä ;)
Hyvä vinkki, mutta ei näytä omaa IP:tä. Mulla on Soneran ADSL ja modemina A-Link. Kun annan nimeksi koneen nimen, saan modemin IP-osoitteen eli osoitteen, josta modemin asetuksia voi muuttaa. Sieltä sitten näkyy oma IP. Mutta kuinka saan oman IP:n suoraan? (localhost antaa tulokseksi localhost)
lainaus:
Hyvä vinkki, mutta ei näytä omaa IP:tä. Mulla on Soneran ADSL ja modemina A-Link. Kun annan nimeksi koneen nimen, saan modemin IP-osoitteen eli osoitteen, josta modemin asetuksia voi muuttaa. Sieltä sitten näkyy oma IP. Mutta kuinka saan oman IP:n suoraan? (localhost antaa tulokseksi localhost)
Sinun tietokoneesi ei tiedä, mikä IP-numero sillä sun ADSL modeemilla on. ADSL modeemi jakaa tietokoneellesi sisäverkon IP-osoitteen jonka avulla tietokone kommunikoi ADSL-modeemin kanssa.
Eli et voi selvittää internettiin näkyvää ip-osoitetta ellet
a) katso sitä ADSL modeemista
b) ota yhteyttä johonkin päin internettiä josta saat vastaukseksi ulospäin näkyvän IP-osoitteesi
Kiitos Meitzi. Tuommoista tietoa jo sainkin. Edellinen Telewellin ADSL-purkki näytti ulospäin näkyvän IP:n ja siksi hieman ihmettelin.