vb 如何获取网上邻居目录及计算机名和ip地址?

wenhu420 2010-10-27 11:12:19
条件:1\首先获取网上邻居目录
2\当点击网上邻居目录列表时,调出此目录下的所有计算机名.
3\当选择某个计算机名时,调出对应的ip地址.


最后:如何优化.我有如何取得计算机名及ip地址,但是相应的速度慢的惊人.


结果:相当于用友的登陆服务器界面,感觉用友的服务器寻址速度很快,它的思路又是怎么样的呢?

谢谢!如果能提出实例更好.

如图
...全文
328 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenhu420 2010-10-30
  • 打赏
  • 举报
回复
可惜啊,没有高手进来吗?
wenhu420 2010-10-28
  • 打赏
  • 举报
回复
这是获取ip地址代码,我经测试通过.但是我无法获取网络资源的目录列表,怎么根据列表获取列表目下的网络资源.请高手帮个忙.我可以把ip,及网络资源计算机名的源码公布.
Option Explicit

Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

' Socket错误常数和版本常数
Private Const SOCKET_ERROR As Long = -1
Private Const MAX_WSADescription = 256
Private Const MAX_WSASYSStatus = 128
Private Const ERROR_SUCCESS As Long = 0
Private Const WS_VERSION_REQD As Long = &H101
Private Const MIN_SOCKETS_REQD As Long = 1
Private Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&

' 存放主机信息的结构
Private Type HOSTENT
hName As Long ' 主机的正式名称
hAliases As Long ' 主机别名列表
hAddrType As Integer ' 主机地址类型
hLen As Integer ' 主机地址长度
hAddrList As Long ' 主机IP地址列表
End Type

' 存放Winsock版本等信息的结构
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 Integer
wMaxUDPDG As Integer
dwVendorInfo As Long
End Type

' 返回给定机器名的Ip地址,机器名为空时返回本机Ip地址
Private Function GetIPAddress(Optional sHost As String) As String
Dim sHostName As String * 256
Dim lpHost As Long
Dim HOST As HOSTENT
Dim dwIPAddr As Long
Dim tmpIPAddr() As Byte
Dim i As Integer
Dim sIPAddr As String
Dim werr As Long

' 如果无法初始化Socket则退出函数
If Not SocketsInitialize() Then
GetIPAddress = ""
Exit Function
End If

' 如果未指定主机名称,则取得本地主机名称并获取其IP
If sHost = "" Then
If gethostname(sHostName, 256) = SOCKET_ERROR Then
werr = WSAGetLastError()
GetIPAddress = ""
SocketsCleanup
Exit Function
End If

sHostName = Trim$(sHostName)
Else
sHostName = Trim$(sHost) & Chr$(0)
End If

' 获得指向主机信息结构的指针
lpHost = gethostbyname(sHostName)

' 如果指针为零,则错误退出
If lpHost = 0 Then
werr = WSAGetLastError()
GetIPAddress = ""
SocketsCleanup
Exit Function
End If

' 从指定内存取得数据
CopyMemory HOST, lpHost, Len(HOST)
CopyMemory dwIPAddr, HOST.hAddrList, 4

' 重新动态分配变量内存
ReDim tmpIPAddr(1 To HOST.hLen)
' 将主机地址存储到tmpIPAddr中
CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen

' 获得最终的主机IP地址字符串
For i = 1 To HOST.hLen
sIPAddr = sIPAddr & tmpIPAddr(i) & "."
Next

' 返回
GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)

' 释放Socket库所占用的系统资源
SocketsCleanup
End Function

' 初始化Socket
Private Function SocketsInitialize(Optional sErr As String) As Boolean
Dim WSAD As WSADATA
Dim sLoByte As String
Dim sHiByte As String

' 初始化Winsock DLL,并判断版本是否满足要求
If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
sErr = "The 32-bit Windows Socket is not responding."
SocketsInitialize = False
Exit Function
End If

' 判断是否有支持足够的Socket
If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
sErr = "This application requires a minimum of " & _
CStr(MIN_SOCKETS_REQD) & " supported sockets."
SocketsInitialize = False
Exit Function
End If

' 判断Winsock的版本是否被32为Winsock支持
If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or _
(LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And _
HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then

sHiByte = CStr(HiByte(WSAD.wVersion))
sLoByte = CStr(LoByte(WSAD.wVersion))

sErr = "Sockets version " & sLoByte & "." & sHiByte & _
" is not supported by 32-bit Windows Sockets."

SocketsInitialize = False
Exit Function
End If

SocketsInitialize = True
End Function

' 释放Socket库所占用的系统资源
Private Sub SocketsCleanup()
If WSACleanup() <> ERROR_SUCCESS Then
App.LogEvent "Socket error occurred in Cleanup.", vbLogEventTypeError
End If
End Sub

' 获得一个整数的高字节位
Private Function HiByte(ByVal wParam As Integer)
HiByte = wParam \ &H1 And &HFF&
End Function

' 获得一个整数的低字节位
Private Function LoByte(ByVal wParam As Integer)
LoByte = wParam And &HFF&
End Function

Private Sub Command1_Click()
On Error Resume Next
Screen.MousePointer = vbHourglass
TxtIp.Text = GetIPAddress(TxtCmpName.Text)
Screen.MousePointer = vbDefault
End Sub
蓝海 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 asftrhgjhkjlkttttttt 的回复:]
2\当点击网上邻居目录列表时,调出此目录下的所有计算机名.
用shell 执行 net view >name.txt 获取所有在线的计算机名,如:
\\PC-200907151525
\\PC-200908111008
\\PC-201002041000
\\PC-201004171507
...

3\当选择某个计算机名时,调出对应的ip地址.
用shell 执行 ping 计……
[/Quote]

好办法!

net view 命令还真没用过,虽然获取 IP 地址通过 API 能实现,但 PING 应该是最可靠的吧!
孤独剑_LPZ 2010-10-28
  • 打赏
  • 举报
回复
2\当点击网上邻居目录列表时,调出此目录下的所有计算机名.
用shell 执行 net view >name.txt 获取所有在线的计算机名,如:
\\PC-200907151525
\\PC-200908111008
\\PC-201002041000
\\PC-201004171507
...

3\当选择某个计算机名时,调出对应的ip地址.
用shell 执行 ping 计算机名 >ip.txt 得ip

自己读取文本分析一下
Tiger_Zhao 2010-10-28
  • 打赏
  • 举报
回复
虽然看不到图,也没用过用友,不过仅获取有指定程序在运行的计算机列表是不一样的。
只要约定好端口,需要取列表的计算机只要通过 winsock 之类发一个广播,其他计算机上的程序就会直接把需要的信息反馈回来。这比逐个检测快多了。
wenhu420 2010-10-28
  • 打赏
  • 举报
回复
用api,但怎么获取目录呢?是不是有点难呢?

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧