在VB中获取本地和服务器IP及端口,核心方案是调用系统API和Winsock控件:本地IP用IPAPI函数或Inet控件的LocalIP属性,服务器IP通过Winsock的RemoteHostIP属性获取,端口则用RemotePort查询。
很多刚开始接触VB网络编程的朋友,都会卡在“我怎么知道连的是谁”这个问题上,调试程序时看着黑乎乎的窗体,既不知道数据发到了哪里,也不清楚对方回了什么,搞懂IP和端口的读取,就像是给程序装了一双眼睛,接下来我把具体方法拆开讲,每个步骤都能直接在你的VB6或VB.NET环境里跑起来。
vb获取本地ip地址的方法有哪些
本地IP的获取是网络编程的地基,方法不止一种,但根据使用场景不同,推荐的优先级也有差异。
用Winsock控件的LocalIP属性直接读取
这是最直观的方式,如果你在窗体上放了Winsock控件,并且已经建立了连接,那么直接读取Winsock1.LocalIP就能拿到本机当前网卡的IP地址。
If Winsock1.State = sckConnected Then
Text1.Text = Winsock1.LocalIP
End If
这里有个小坑:如果控件处于监听状态但没有实际连接,LocalIP可能返回空字符串或默认地址,行业共识认为,最稳妥的时机是连接建立成功后,或者客户端连上服务器触发ConnectionRequest事件时再读。
通过IPAPI函数获取更完整的网卡信息
Winsock控件的LocalIP只返回当前活动连接对应的IP,如果是多网卡机器,或者想要所有网卡的IP列表,就得用API了。
在标准模块里声明以下两个函数:
Private Declare Function gethostname Lib "ws2_32.dll" (ByVal name As String, ByVal namelen As Long) As Long Private Declare Function gethostbyname Lib "ws2_32.dll" (ByVal hostname As String) As Long
核心逻辑是先取得本机主机名,再根据主机名解析出IP地址,完整流程这样走:
- 用
gethostname获取计算机名 - 将主机名传给
gethostbyname - 从返回的内存地址中按结构体偏移量提取IP字符串
实测下来这个方案能拿到所有网卡的IPv4地址,包括虚拟网卡和无线网卡的地址,在局域网调试多网卡设备时特别好用,不会出现因默认网关网卡和实际工作网卡不一致导致的取值错误。
实践中怎么选
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| 单网卡简单的客户端程序 | Winsock控件的LocalIP | 代码量小,逻辑清晰 |
| 多网卡服务器 | IPAPI函数遍历 | 能拿到完整网卡列表,避免取错IP |
| 需要在连接前就知道IP | IPAPI函数 | 不依赖连接状态,随时可调用 |
vb获取远程服务器ip端口的方法
拿到服务器的IP和端口,是判断“我到底连上没”的关键,Winsock控件本身就带了两个现成的属性:RemoteHostIP和RemotePort,这两个属性在连接成功后自动填充,不需要额外解析。
在连接建立后读取RemoteHostIP和RemotePort
服务器端代码里这样写:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
' 关闭原有连接
If Winsock1.State <> sckClosed Then Winsock1.Close
' 接受新连接
Winsock1.Accept requestID
' 此时自动获取到客户端IP和端口
Text1.Text = "客户端IP: " & Winsock1.RemoteHostIP & " 端口: " & Winsock1.RemotePort
End Sub
客户端这边则是在Connect事件触发后读取:
Private Sub Winsock1_Connect()
Text1.Text = "服务器地址: " & Winsock1.RemoteHost & ":" & Winsock1.RemotePort
End Sub
这个方案简单可靠,几乎所有VB网络程序都会用到。
通过URL解析服务器ip端口
有时候你只知道域名字符串,比如www.example.com:8080,需要拆分出IP和端口,这时可以使用Winsock控件的ResolveHostName方法,或者用API直接解析域名。
用API的gethostbyname函数,传入域名返回IP,端口则需要从URL字符串里自己拆分,规则很简单::”后面是数字,就是端口;否则默认80(HTTP)或443(HTTPS)。
Function SplitUrl(ByVal url As String, ByRef ipAs String, ByRef port As Long) Dim temp As String ' 去掉协议头 url = Replace(url, "http://", "") url = Replace(url, "https://", "") ' 斜杠截断 If InStr(url, "/") > 0 Then url = Left(url, InStr(url, "/") - 1) ' 冒号拆端口 If InStr(url, ":") > 0 Then port = CLng(Mid(url, InStr(url, ":") + 1)) ip = Left(url, InStr(url, ":") - 1) Else port = 80 ip = url End If End Function
业内专家指出,在Windows下通过Winsock控件解析域名,实际上是调用了系统底层的DNS解析服务,所以不需要额外引入第三方库。
测试远程服务器端口是否开放的技巧
有时候你想确认某个服务器的端口是否能连通,VB里可以直接用Winsock试探:
Private Sub TestPort(ByVal hostIP As String, ByVal port As Long)
Winsock1.RemoteHost = hostIP
Winsock1.RemotePort = port
Winsock1.Connect ' 如果触发Connect说明通了,触发Error说明不通
End Sub
给Winsock1设置一个超时定时器,比如8秒后如果还在连接中,就判定为超时,用这种方式批量测试内网服务器的端口开放情况,比命令行逐条敲telnet高效得多。
实战中检测端口和IP配合的几个场景
理解概念后,还需要在真实项目中把这些串起来,下面几个场景覆盖了大多数VB开发者的日常需求。
局域网聊天工具的双端信息同步
写一个VB局域网聊天程序,服务器端需要在客户端接入时获取对方的IP和端口并显示在用户列表里,具体做法是:服务器在ConnectionRequest事件里获取RemoteHostIP和RemotePort,存入数组或ListView,客户端收到服务器回复后,用自己的LocalIP和LocalPort来区分是哪个网卡发出去的。
数据库连接串和防火墙白名单梳理
很多VB程序用ADO连接SQL Server,连接串里写的是服务器IP和端口,排查连接问题时,你可以在程序里加一个诊断窗体,动态显示当前使用的连接字符串里的IP和端口,并用Winsock测试该端口是否可达,这个做法能快速定位是网络不通还是SQL Server服务没启动。
' 示例:诊断数据库服务器连通性 Winsock1.RemoteHost = "192.168.1.100" Winsock1.RemotePort = 1433 ' SQL Server默认端口 Winsock1.Connect
如果连不通,再检查防火墙是否放行该端口、远程访问权限是否开启,这个诊断方法在修改服务器迁移时特别有用,不用反复改数据库连接串来试错。
记录日志排查异常连接
给服务端程序加一个链接日志功能:每次有新客户端连接,就把RemoteHostIP、RemotePort、连接时间写入文本文件,这样出了问题可以翻日志看是哪个IP在什么时间连进来的,是不是正常的客户端,有没有异常扫描行为,这个功能对排查局域网内的IP冲突或者端口占用问题也有效。
一个常见误区是混淆LocalPort和RemotePort,LocalPort是程序本机绑定的端口,RemotePort是对端机器上的端口,比如客户端连接服务器的80端口,服务器看到的RemotePort是客户端机器上的随机端口(比如53214),而服务器的LocalPort则是80,这个区分在写端口转发和NAT穿透程序时特别关键。
Q&A:vb获取ip端口常见问题解答
为什么Winsock的RemoteHostIP在服务器端总是返回空字符串?
服务器端没有调用Accept之前,RemoteHostIP不会更新,必须在ConnectionRequest事件里执行了Accept requestID之后,RemoteHostIP才是有效值,另外注意如果Winsock还处于Listening状态,读取到的也是空值。
如何获取客户端在路由器NAT之后的真实IP?
VB的Winsock直接拿到的RemoteHostIP是路由器分配的内网IP,比如192.168.1.5,要获得公网IP,需要借助外部服务在程序里请求一个公网API接口(如ipify.org的JSON接口),解析返回的文本得到公网出口IP,这个方案依赖外部网络,局域网环境用不了。
端口获取到了但程序连不上,一般是什么原因?
先确认目标服务器的端口是否真的处于监听状态,本机可以用netstat -an命令查,服务器在公网的话,还要检查云服务商的安全组规则和本机防火墙是否放行了该端口,有一种情况是服务器程序监听在127.0.0.1上,外部连接当然进不来,这时需要用0.0.0作为监听地址。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/745917.html





