vb6-如何根据给定的IP地址获取远程计算机名

vb6-如何根据给定的IP地址获取远程计算机名,vb6,Vb6,如何根据vb6中给定的IP地址获取远程计算机名?有什么方法可以列出链接到当前计算机的计算机列表吗?根据这一点,标准的GetHostByAddr()函数应该可以做到这一点。不幸的是,我找不到任何关于如何在VB6中执行GetHostByAddr调用的示例,但也许其他人可以提供帮助。或者,您可以运行命令行工具,如nslookup: bensonk@hunter ~/Desktop/cont $ nslookup 64.34.119.12 Server: 208.67.222.222 Addre

如何根据vb6中给定的IP地址获取远程计算机名?有什么方法可以列出链接到当前计算机的计算机列表吗?

根据这一点,标准的
GetHostByAddr()
函数应该可以做到这一点。不幸的是,我找不到任何关于如何在VB6中执行
GetHostByAddr
调用的示例,但也许其他人可以提供帮助。或者,您可以运行命令行工具,如nslookup:

bensonk@hunter ~/Desktop/cont $ nslookup 64.34.119.12
Server:     208.67.222.222
Address:    208.67.222.222#53

Non-authoritative answer:
12.119.34.64.in-addr.arpa   name = stackoverflow.com.

该示例在linux机器上运行,但同样的命令在windows上也可以正常工作

如果反向DNS查找符合您的要求,这可能会有所帮助。此示例简化了DNS结果的处理,但应该可以让您开始,并且可能已经足够:

Option Explicit

Private Const DNS_TYPE_PTR = &HC
Private Const DNS_QUERY_STANDARD = &H0
Private Const DnsFreeRecordListDeep = 1&

Private Enum DNS_STATUS
    ERROR_BAD_IP_FORMAT = -3&
    ERROR_NO_PTR_RETURNED = -2&
    ERROR_NO_RR_RETURNED = -1&
    DNS_STATUS_SUCCESS = 0&
End Enum

Private Type VBDnsRecord
    pNext As Long
    pName As Long
    wType As Integer
    wDataLength As Integer
    Flags As Long
    dwTTL As Long
    dwReserved  As Long
    prt As Long
    others(9) As Long
End Type

Private Declare Function DnsQuery Lib "Dnsapi" Alias "DnsQuery_A" ( _
    ByVal Name As String, _
    ByVal wType As Integer, _
    ByVal Options As Long, _
    ByRef aipServers As Any, _
    ByRef ppQueryResultsSet As Long, _
    ByVal pReserved As Long) As Long

Private Declare Function DnsRecordListFree Lib "Dnsapi" ( _
    ByVal pDnsRecord As Long, _
    ByVal DnsFreeRecordListDeep As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByRef pTo As Any, _
    ByRef uFrom As Any, _
    ByVal lSize As Long)

Private Declare Function StrCopyA Lib "kernel32" Alias "lstrcpyA" ( _
    ByVal retval As String, _
    ByVal PTR As Long) As Long

Private Declare Function StrLenA Lib "kernel32" Alias "lstrlenA" ( _
    ByVal PTR As Long) As Long

Public Function IP2HostName(ByVal IP As String, ByRef HostName As String) As Long
    Dim Octets() As String
    Dim OctX As Long
    Dim NumPart As Long
    Dim BadIP As Boolean
    Dim lngDNSRec As Long
    Dim Record As VBDnsRecord
    Dim Length As Long
    'Returns DNS_STATUS Enum values, otherwise a DNS system error code.

    IP = Trim$(IP)
    If Len(IP) = 0 Then IP2HostName = ERROR_BAD_IP_FORMAT: Exit Function
    Octets = Split(IP, ".")
    If UBound(Octets) <> 3 Then IP2HostName = ERROR_BAD_IP_FORMAT: Exit Function
    For OctX = 0 To 3
        If IsNumeric(Octets(OctX)) Then
            NumPart = CInt(Octets(OctX))
            If 0 <= NumPart And NumPart <= 255 Then
                Octets(OctX) = CStr(NumPart)
            Else
                BadIP = True
                Exit For
            End If
        Else
            BadIP = True
            Exit For
        End If
    Next
    If BadIP Then IP2HostName = ERROR_BAD_IP_FORMAT: Exit Function

    IP = Octets(3) & "." & Octets(2) & "." & Octets(1) & "." & Octets(0) & ".IN-ADDR.ARPA"

    IP2HostName = DnsQuery(IP, DNS_TYPE_PTR, DNS_QUERY_STANDARD, ByVal 0, lngDNSRec, 0)
    If IP2HostName = DNS_STATUS_SUCCESS Then
        If lngDNSRec <> 0 Then
            CopyMemory Record, ByVal lngDNSRec, LenB(Record)

            With Record
                If .wType = DNS_TYPE_PTR Then
                    Length = StrLenA(.prt)
                    HostName = String$(Length, 0)
                    StrCopyA HostName, .prt
                Else
                    IP2HostName = ERROR_NO_PTR_RETURNED
                End If
            End With
            DnsRecordListFree lngDNSRec, DnsFreeRecordListDeep
        Else
            IP2HostName = ERROR_NO_RR_RETURNED
        End If
    'Else
        'Return with DNS error code.
    End If
End Function
选项显式
私有常量DNS_TYPE_PTR=&HC
私有常量DNS\u查询\u标准=&H0
私有常量DnsFreeRecordListDeep=1&
私有枚举DNS_状态
错误\u错误\u IP\u格式=-3&
返回的错误\u NO\u PTR\u=-2&
返回的错误\u NO\u RR\u=-1&
DNS_状态_成功=0&
结束枚举
专用类型VBDnsRecord
pNext尽可能长
pName尽可能长
wType为整数
wDataLength为整数
旗子一样长
dwTTL尽可能长
只要
prt尽可能长
其他人(9)只要
端型
专用声明函数DnsQuery Lib“Dnsapi”别名“DnsQuery_A”(_
ByVal名称作为字符串_
ByVal w类型为整数_
ByVal选项,只要_
ByRef AIPServer(如有)_
ByRef ppQueryResultsSet只要_
拜瓦尔保存的时间)一样长
私有声明函数DnsRecordListFree Lib“Dnsapi”(_
ByVal pDnsRecord,只要_
ByVal DnsFreeRecordListDeep尽可能长)尽可能长
私有声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(_
ByRef pTo(如有)_
ByRef uFrom和其他人一样_
ByVal(尽可能长)
私有声明函数StrCopyA Lib“kernel32”别名“lstrcpyA”(_
ByVal retval作为字符串_
ByVal PTR As Long)As Long
私有声明函数StrLenA Lib“kernel32”别名“lstrlenA”(_
ByVal PTR As Long)As Long
公共函数IP2HostName(ByVal IP作为字符串,ByRef HostName作为字符串)的长度
Dim Octets()作为字符串
Dim-OctX与长
暗淡的NumPart如长
Dim BadIP作为布尔值
变暗lngDNSRec为长
Dim记录为VBDnsRecord
暗长
'返回DNS_状态枚举值,否则返回DNS系统错误代码。
IP=修剪$(IP)
如果Len(IP)=0,则IP2HostName=ERROR\u BAD\u IP\u FORMAT:Exit函数
八位字节=拆分(IP,“.”)
如果UBound(八位字节)3,则IP2HostName=错误\u错误\u IP\u格式:退出函数
对于OctX=0到3
如果是数字(八位字节(OctX)),则
NumPart=CInt(八位字节(OctX))

如果0有史以来最简单的技术

要发送计算机名, 这样做:

创建一个文本框

将其多行属性更改为true

之后,在该文本框的文本属性中,写下以下内容:

echo %computername% >> C:\temp.txt
然后,使用
Fileinput
,输入文本文件并输入文本文件
C:\temp.txt

如果要通过winsock或LAN发送,请使用
winsock1.sendata


完成

这是在一个受严格约束的局域网内完成的吗?除此之外,机器和IP地址之间没有1-1对应关系。另外,您是在尝试实时发现这些信息,还是从日志中发现这些信息?是的,它是通过LAN连接的,我希望在用户在我的应用程序中输入服务器IP地址时,在运行时获取计算机名。这可能吗?当你说“计算机名”时,你是指DNS系统中计算机的完全限定域名,还是指windows中的“计算机名”(即其NetBIOS名称)?windows中的计算机名,以便我可以使用它远程访问计算机。我目前正在使用UNC add访问服务器,例如\\server1您可以在UNC路径中使用IP地址。我认为在VB6中没有任何易于解析的IP->Machine name-您可能必须运行命令行命令,捕获输出(我认为在VB6中这相当容易,如果我没记错的话),并解析该输出。反向DNS确实是他想要的,因为无法使用DNS解析名称的地址会导致NetBIOS查找。:-)