'vb中从域名得到IP及从IP得到域名 Private Const WS_VERSION_REQD = &H101Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&Private Const MIN_SOCKETS_REQD = 1Private Const SOCKET_ERROR = -1Private Const WSADescription_Len = 256Private Const WSASYS_Status_Len = 128Private Type HOSTENT hname As Long hAliases As Long hAddrType As Integer hLength As Integer hAddrList As LongEnd TypePrivate Type WSADATA wversion As Integer wHighVersion As Integer szDescription(0 To WSADescription_Len) As Byte szSystemStatus(0 To WSASYS_Status_Len) As Byte iMaxSockets As Integer iMaxUdpDg As Integer lpszVendorInfo As LongEnd TypePrivate Declare Function gethostbyaddr Lib "WSOCK32.DLL" (addr As Any, ByVal _byteslen As Integer, addrtype As Integer) As LongPrivate Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As LongPrivate Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _ wVersionRequired&, lpWSAData As WSADATA) As LongPrivate Declare Function WSACleanup Lib "WSOCK32.DLL" () As LongPrivate Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _ hostname$) As LongPrivate Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, _ ByVal hpvSource&, ByVal cbCopy&)Function hibyte(ByVal wParam As Integer) '获得整数的高位 hibyte = wParam \ &H100 And &HFF&End FunctionFunction lobyte(ByVal wParam As Integer) '获得整数的低位 lobyte = wParam And &HFF&End FunctionFunction SocketsInitialize() Dim WSAD As WSADATA Dim iReturn As Integer Dim sLowByte As String, sHighByte As String, sMsg As String iReturn = WSAStartup(WS_VERSION_REQD, WSAD) If iReturn <> 0 Then MsgBox "Winsock.dll 没有反应." End End If If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then sHighByte = Trim$(str$(hibyte(WSAD.wversion))) sLowByte = Trim$(str$(lobyte(WSAD.wversion))) sMsg = "Windows Sockets版本 " & sLowByte & "." & sHighByte sMsg = sMsg & " 不被winsock.dll支持 " MsgBox sMsg End End If If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then sMsg = "这个系统需要的最少Sockets数为 " sMsg = sMsg & Trim$(str$(MIN_SOCKETS_REQD)) MsgBox sMsg End End If End FunctionSub SocketsCleanup() Dim lReturn As Long lReturn = WSACleanup() If lReturn <> 0 Then MsgBox "Socket错误 " & Trim$(str$(lReturn)) & " occurred in Cleanup " End End IfEnd SubSub Form_Load() '初始化Socket SocketsInitializeEnd SubPrivate Sub Form_Unload(Cancel As Integer) '清除Socket SocketsCleanupEnd SubPrivate Function getip(name As String) As String Dim hostent_addr As Long Dim host As HOSTENT Dim hostip_addr As Long Dim temp_ip_address() As Byte Dim i As Integer Dim ip_address As String hostent_addr = gethostbyname(name) If hostent_addr = 0 Then getip = "" '主机名不能被解释 Exit Function End If RtlMoveMemory host, hostent_addr, LenB(host) RtlMoveMemory hostip_addr, host.hAddrList, 4 ReDim temp_ip_address(1 To host.hLength) RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength For i = 1 To host.hLength ip_address = ip_address & temp_ip_address(i) & "." Next ip_address = Mid$(ip_address, 1, Len(ip_address) - 1) getip = ip_addressEnd FunctionPrivate Sub Command1_click() Dim str As String str = getip(Text1.Text) If str = "" Then Text2.Text = "主机名不能被解释" Else Text2.Text = str End IfEnd SubPrivate Function getname(addrstr As String) As String Dim hostent_addr As Long Dim host As HOSTENT Dim addr(0 To 50) As Byte Dim addrs As String Dim hname(1 To 50) As Byte Dim str As String Dim i As Integer, j As Integer Dim temp_int As Integer Dim byt As Byte str = Trim$(addrstr) i = 0 j = 0 Do temp_int = 0 i = i + 1 Do While Mid$(str, i, 1) >= "0" And Mid$(str, i, 1) <= "9" And i <= Len(str) temp_int = temp_int * 10 + Mid$(str, i, 1) i = i + 1 Loop If temp_int <= 255 Then addr(j) = temp_int j = j + 1 End If Loop Until Mid$(str, i, 1) <> "." Or i > Len(str) Or temp_int > 255 If temp_int > 255 Then getname = "地址非法" Exit Function End If hostent_addr = gethostbyaddr(addr(0), j, 2) If hostent_addr = 0 Then getname = "此地址无法解析" Exit Function End If RtlMoveMemory host, hostent_addr, LenB(host) RtlMoveMemory hname(1), host.hname, 50 j = 51 For i = 1 To 50 If hname(i) = 0 Then j = i End If If i >= j Then hname(i) = 32 End If Next i getname = Trim$(StrConv(hname, vbUnicode))End FunctionPrivate Sub Command2_Click() Dim name As String name = getname(Text2.Text) If name = "" Then name = "此地址没有域名" End If Text1.Text = nameEnd Sub