Skip to content

cWinsock 属性参考

📋 属性列表

属性名类型读写说明
StateWinsockState只读当前 Socket 状态
ProtocolWinsockProtocol读写协议类型(TCP/UDP)
RecvBufferByte()读写自定义接收缓冲区
LocalPortLong读写本地端口
RemoteHostString读写远程主机名
RemotePortLong读写远程端口
RemoteHostIPString只读解析后的远程 IP 地址
LocalHostNameString只读本地主机名
LocalIPString只读本地 IP 地址
TagString读写用户自定义标签
UserDataVariant读写用户自定义数据
SocketHandleLong只读Socket 句柄
BytesReceivedLong只读可用数据字节数
IsServerBoolean只读是否为服务器模式
IsAcceptedClientBoolean只读是否为服务器接受的客户端
ParentServercWinsock只读父服务器对象(仅客户端)
ClientsCollection只读所有连接的客户端集合(仅服务器)
ClientCountLong只读客户端连接数(仅服务器)
CurrentUserVariant读写绑定的用户名(用户绑定功能)
CurrentUserTokenString读写用户认证令牌(用户绑定功能)
CurrentUserInfocJson读写用户扩展信息(用户绑定功能)
CountUsersLong只读当前绑定的用户数量(用户绑定功能)
CountGroupsLong只读当前组数量(用户绑定功能)
PacketHandlercPacketProtocol读写封包协议处理器对象(高级配置)
PacketProtocolPacketProtocolType读写封包协议类型(快速设置)
DelimiterString读写分隔符协议的分隔符(默认 vbCrLf)
FixedLengthLong读写定长协议的消息长度
HeaderBytesLong读写长度头协议的头字节数(2或4,默认4)
HeaderEndianEndianEnum读写长度头协议的字节序(默认小端)
MaxPacketSizeLong读写单包最大字节数(默认1MB),防恶意超大包
MaxBufferSizeLong读写缓冲区累积上限(默认4MB),防内存耗尽
HeartbeatcHeartbeat只读心跳管理器对象(高级配置)
AutoHeartbeatBoolean读写启用/禁用自动心跳(内嵌 cTimer)
HeartbeatTimeoutLong读写服务端心跳超时秒数(默认120)
HeartbeatIntervalLong读写客户端心跳间隔秒数(默认50)
HeartbeatDataByte()读写心跳包内容(默认单字节0)
IdleSecondsLong只读当前空闲秒数

🔄 State 属性

说明

返回当前 Socket 的状态。

语法

vb
Property Get State() As WinsockState

返回值

常量说明
sckClosed0已关闭
sckOpen1已打开(UDP 绑定后)
sckListening2监听中(TCP 服务器)
sckConnectionPending3连接挂起
sckResolvingHost4正在解析主机名
sckHostResolved5主机名已解析
sckConnecting6正在连接
sckConnected7已连接
sckClosing8正在关闭
sckError9发生错误

使用示例

vb
Private Sub cmdConnect_Click()
    If m_oClient.State = sckClosed Then
        m_oClient.Connect "127.0.0.1", 8080
    Else
        MsgBox "Socket 未关闭,当前状态: " & GetStateName(m_oClient.State)
    End If
End Sub

Private Function GetStateName(ByVal eState As WinsockState) As String
    Select Case eState
        Case sckClosed:   GetStateName = "已关闭"
        Case sckOpen:     GetStateName = "已打开"
        Case sckListening: GetStateName = "监听中"
        Case sckConnected: GetStateName = "已连接"
        Case sckClosing:  GetStateName = "关闭中"
        Case sckError:    GetStateName = "错误"
        Case Else:        GetStateName = "未知"
    End Select
End Function

🌐 Protocol 属性

说明

获取或设置 Socket 使用的协议类型。

语法

vb
Property Get Protocol() As WinsockProtocol
Property Let Protocol(ByVal Value As WinsockProtocol)

常量说明
sckTCPProtocol1TCP 协议(可靠,面向连接)
sckUDPProtocol2UDP 协议(不可靠,无连接)

使用示例

vb
' 设置为 TCP 协议
m_oSocket.Protocol = sckTCPProtocol

' 设置为 UDP 协议
m_oSocket.Protocol = sckUDPProtocol

' 检查当前协议
If m_oSocket.Protocol = sckTCPProtocol Then
    Debug.Print "使用 TCP 协议"
Else
    Debug.Print "使用 UDP 协议"
End If

⚠️ 注意事项

  • 只能在 State = sckClosed 时修改
  • 修改后需要重新调用 Connect()Listen()Bind()

📦 RecvBuffer 属性

说明

设置或获取自定义接收缓冲区。通常用于高级场景。

语法

vb
Property Let RecvBuffer(ByRef Value() As Byte)

使用示例

vb
' 设置自定义缓冲区
Dim baCustomBuffer() As Byte
ReDim baCustomBuffer(0 To 8191) ' 8KB 缓冲区
m_oSocket.RecvBuffer = baCustomBuffer

🔌 LocalPort 属性

说明

获取或设置本地端口号。

语法

vb
Property Get LocalPort() As Long
Property Let LocalPort(ByVal Value As Long)

使用示例

vb
' 设置本地端口(必须在调用 Connect/Listen/Bind 之前)
m_oServer.LocalPort = 8080
m_oServer.Listen

' 获取实际绑定的端口
Debug.Print "本地端口: " & m_oSocket.LocalPort

⚠️ 注意事项

  • 只能在 State = sckClosed 时设置
  • 范围:0-65535
  • 0 表示由系统自动分配

🌍 RemoteHost 属性

说明

获取或设置远程主机名(域名或 IP)。

语法

vb
Property Get RemoteHost() As String
Property Let RemoteHost(ByVal Value As String)

使用示例

vb
' 设置远程主机(可以使用域名)
m_oClient.RemoteHost = "example.com"
m_oClient.RemotePort = 80
m_oClient.Connect

' 使用 IP 地址
m_oClient.RemoteHost = "192.168.1.100"
m_oClient.RemotePort = 8080
m_oClient.Connect

' 获取远程主机名
Debug.Print "远程主机: " & m_oClient.RemoteHost

🔢 RemotePort 属性

说明

获取或设置远程端口号。

语法

vb
Property Get RemotePort() As Long
Property Let RemotePort(ByVal Value As Long)

使用示例

vb
' 设置远程端口
m_oClient.RemotePort = 8080

' 获取远程端口
Debug.Print "远程端口: " & m_oClient.RemotePort

🖥️ RemoteHostIP 属性

说明

获取解析后的远程 IP 地址(只读)。

语法

vb
Property Get RemoteHostIP() As String

使用示例

vb
Private Sub m_oClient_Connect(Client As cWinsock)
    Debug.Print "连接成功!"
    Debug.Print "主机名: " & Client.RemoteHost
    Debug.Print "IP 地址: " & Client.RemoteHostIP
    Debug.Print "端口: " & Client.RemotePort
End Sub

特殊情况:UDP 服务器虚拟客户端

vb
Private Sub m_oUdp_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    ' UDP 服务器模式下,虚拟客户端的 RemoteHostIP 返回发送方 IP
    Debug.Print "收到来自 " & Client.RemoteHostIP & ":" & Client.RemotePort & " 的数据"
End Sub

💻 LocalHostName 属性

说明

获取本地主机名。

语法

vb
Property Get LocalHostName() As String

使用示例

vb
Debug.Print "本机名: " & m_oSocket.LocalHostName

🌐 LocalIP 属性

说明

获取本地 IP 地址。

语法

vb
Property Get LocalIP() As String

使用示例

vb
Debug.Print "本机 IP: " & m_oSocket.LocalIP

🏷️ Tag 属性

说明

用户自定义标签,用于标识对象。

语法

vb
Property Get Tag() As String
Property Let Tag(ByVal Value As String)

使用示例

vb
' 为每个客户端设置标签
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
    ' 服务器会自动设置 Tag 为 "#1", "#2", "#3"...
    ' 也可以自定义
    Client.Tag = "客户端-" & Client.RemoteHostIP
    
    Debug.Print "新客户端 Tag: " & Client.Tag
End Sub

' 通过 Tag 查找客户端
Private Function FindClientByTag(ByVal sTag As String) As cWinsock
    Dim oClient As cWinsock
    For Each oClient In m_oServer.Clients
        If oClient.Tag = sTag Then
            Set FindClientByTag = oClient
            Exit Function
        End If
    Next
    Set FindClientByTag = Nothing
End Function

💾 UserData 属性

说明

用户自定义数据存储,可以存储任意类型的数据。

语法

vb
Property Get UserData() As Variant
Property Let UserData(ByVal Value As Variant)
Property Set UserData(ByVal Value As Variant)

使用示例

vb
' 存储字符串
m_oClient.UserData = "用户信息: 张三"

' 存储数字
m_oClient.UserData = 12345

' 存储对象
Dim oUserInfo As New CUserInfo
oUserInfo.Name = "张三"
oUserInfo.Age = 25
Set m_oClient.UserData = oUserInfo

' 读取数据
Dim sInfo As String
sInfo = m_oClient.UserData
Debug.Print sInfo

' 读取对象
Dim oUserData As CUserInfo
Set oUserData = m_oClient.UserData
Debug.Print oUserInfo.Name & ", " & oUserData.Age

高级用法:客户端会话数据

vb
Private Type tSessionData
    LoginTime As Date
    LastActivity As Date
    LoginAttempts As Long
    Authenticated As Boolean
End Type

Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
    Dim tSession As tSessionData
    tSession.LoginTime = Now
    tSession.LastActivity = Now
    tSession.LoginAttempts = 0
    tSession.Authenticated = False
    
    Client.UserData = tSession
End Sub

Private Sub CheckSessionTimeout()
    Dim oClient As cWinsock
    Dim tSession As tSessionData
    
    For Each oClient In m_oServer.Clients
        tSession = oClient.UserData
        If DateDiff("s", tSession.LastActivity, Now) > 300 Then ' 5 分钟无活动
            Debug.Print "会话超时,断开: " & oClient.Tag
            oClient.Close_
        End If
    Next
End Sub

🔑 SocketHandle 属性

说明

获取底层的 Socket 句柄(只读)。

语法

vb
Property Get SocketHandle() As Long

使用示例

vb
' 获取 Socket 句柄
Debug.Print "Socket 句柄: " & m_oSocket.SocketHandle

' 用于高级操作(如与 Win32 API 交互)
If m_oSocket.SocketHandle <> 0 Then
    Call SomeWin32Function(m_oSocket.SocketHandle)
End If

📊 BytesReceived 属性

说明

获取接收缓冲区中可用的字节数(只读)。

语法

vb
Property Get BytesReceived() As Long

使用示例

vb
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Debug.Print "事件通知: " & bytesTotal & " 字节"
    Debug.Print "缓冲区总计: " & Client.BytesReceived & " 字节"
    
    ' 只读取部分数据
    If Client.BytesReceived > 100 Then
        Dim sData As String
        Client.GetData sData, vbString, 100 ' 只读取前 100 字节
        Debug.Print "读取了部分数据: " & sData
    End If
End Sub

🏢 IsServer 属性

说明

判断当前对象是否为服务器模式(只读)。

语法

vb
Property Get IsServer() As Boolean

使用示例

vb
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    If Client.IsServer Then
        Debug.Print "来自服务器的数据"
    Else
        Debug.Print "来自客户端的数据"
    End If
End Sub

🔗 IsAcceptedClient 属性

说明

判断当前对象是否为服务器接受的客户端(只读)。

语法

vb
Property Get IsAcceptedClient() As Boolean

使用示例

vb
Private Sub SomeFunction(oSocket As cWinsock)
    If oSocket.IsAcceptedClient Then
        Debug.Print "这是服务器接受的客户端"
        Debug.Print "父服务器: " & oSocket.ParentServer.Tag
    Else
        Debug.Print "这是独立客户端或服务器对象"
    End If
End Sub

👆 ParentServer 属性

说明

获取父服务器对象(仅对服务器接受的客户端有效)。

语法

vb
Property Get ParentServer() As cWinsock

使用示例

vb
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
    ' 服务器设置 ParentServer
    ' 客户端可以访问父服务器
    
    Debug.Print "新客户端的父服务器: " & Client.ParentServer.Tag
End Sub

高级用法:客户端广播消息

vb
' 在某个客户端的事件中,通过父服务器向其他客户端广播
Private Sub ClientBroadcastToOthers(ByVal oSender As cWinsock, ByVal sMessage As String)
    Dim oClient As cWinsock
    For Each oClient In oSender.ParentServer.Clients
        If Not oClient Is oSender Then ' 不发送给自己
            oClient.SendData sMessage
        End If
    Next
End Sub

👥 Clients 属性

说明

获取所有连接的客户端集合(仅对服务器对象有效)。

语法

vb
Property Get Clients() As Collection

使用示例

vb
' 遍历所有客户端
Private Sub ListAllClients()
    Debug.Print "当前连接数: " & m_oServer.ClientCount
    
    Dim oClient As cWinsock
    For Each oClient In m_oServer.Clients
        Debug.Print oClient.Tag & ": " & oClient.RemoteHostIP & ":" & oClient.RemotePort
    Next
End Sub

' 查找特定客户端
Private Function FindClientByIP(ByVal sIP As String) As cWinsock
    Dim oClient As cWinsock
    For Each oClient In m_oServer.Clients
        If oClient.RemoteHostIP = sIP Then
            Set FindClientByIP = oClient
            Exit Function
        End If
    Next
    Set FindClientByIP = Nothing
End Function

' 向所有客户端广播
Private Sub BroadcastToAll(ByVal sMessage As String)
    Dim oClient As cWinsock
    For Each oClient In m_oServer.Clients
        On Error Resume Next
        oClient.SendData sMessage
        On Error GoTo 0
    Next
End Sub

🔢 ClientCount 属性

说明

获取当前连接的客户端数量(只读,仅对服务器对象有效)。

语法

vb
Property Get ClientCount() As Long

使用示例

vb
' 显示连接数
lblClientCount.Caption = "当前连接: " & m_oServer.ClientCount

' 限制最大连接数
Private Sub m_oServer_ConnectionRequest(Client As cWinsock, ByRef DisConnect As Boolean)
    If m_oServer.ClientCount >= m_lMaxClients Then
        Debug.Print "达到最大连接数限制: " & m_lMaxClients
        DisConnect = True
    End If
End Sub

👤 CurrentUser 属性

说明

获取或设置绑定的用户名(用于用户绑定功能)。当使用 BindUser 方法绑定用户后,该属性自动设置为用户名。

语法

vb
Public CurrentUser As Variant

使用示例

vb
' 客户端连接时绑定用户
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    Client.GetData sData
    
    If Left$(sData, 6) = "LOGIN:" Then
        Dim sUsername As String
        sUsername = Mid$(sData, 7)
        
        ' 绑定用户
        m_oServer.BindUser sUsername, Client
        
        ' 验证绑定成功
        Debug.Print "Client.CurrentUser = " & Client.CurrentUser
    End If
End Sub

' 检查用户是否已登录
Private Sub CheckUserLogin(ByVal oClient As cWinsock)
    If LenB(CStr(oClient.CurrentUser)) = 0 Then
        Debug.Print "用户未登录"
    Else
        Debug.Print "当前用户: " & oClient.CurrentUser
    End If
End Sub

与 Tag 属性的区别

属性用途设置方式
Tag标识 socket 连接(如 "#001")自动分配或手动设置
CurrentUser标识登录用户通过 BindUser 绑定

自动清理

当客户端断开连接时(调用 Close_ 或对象销毁),系统会自动解绑用户,无需手动处理。


🔑 CurrentUserToken 属性

说明

获取或设置用户认证令牌(用于用户绑定功能)。当使用 BindUser 方法绑定用户时传入 Token 参数,该属性自动设置为对应值。

语法

vb
Public CurrentUserToken As String

使用示例

vb
' 绑定用户时传入 Token
m_oServer.BindUser "alice", Client, "jwt_token_xyz123"

' 后续验证 Token
If Client.CurrentUserToken = "jwt_token_xyz123" Then
    Debug.Print "Token 验证通过"
End If

' 获取当前用户的 Token
Debug.Print "用户 " & Client.CurrentUser & " 的 Token: " & Client.CurrentUserToken

📋 CurrentUserInfo 属性

说明

获取或设置用户扩展信息(用于用户绑定功能)。当使用 BindUser 方法绑定用户时传入 Info 参数(cJson 对象),该属性自动设置为对应值。可用于存储用户的额外元数据,如登录时间、IP 地址、权限等级等。

语法

vb
Public CurrentUserInfo As cJson

使用示例

vb
' 绑定用户时传入扩展信息
Dim oInfo As New cJson
oInfo.Add "loginTime", Now
oInfo.Add "ip", Client.RemoteHostIP
oInfo.Add "role", "admin"
m_oServer.BindUser "alice", Client, , oInfo

' 读取用户扩展信息
Debug.Print "登录时间: " & Client.CurrentUserInfo.Item("loginTime")
Debug.Print "角色: " & Client.CurrentUserInfo.Item("role")

' 动态添加信息
Client.CurrentUserInfo.Add "lastActivity", Now

与 UserData 的区别

属性用途生命周期
UserData通用自定义数据存储由用户手动管理
CurrentUserInfo用户绑定的结构化信息(JSON)BindUser/UnbindUser 自动管理

🔢 CountUsers 属性

说明

获取当前已绑定用户的数量(只读)。通过 BindUser 方法绑定的用户会计入此计数。

语法

vb
Property Get CountUsers() As Long

使用示例

vb
' 显示当前绑定用户数
Debug.Print "当前绑定用户数: " & m_oServer.CountUsers

' 监控用户登录状态
Private Sub UpdateUserCount()
    lblUserCount.Caption = "在线用户: " & m_oServer.CountUsers
End Sub

' 在 DataArrival 中检查
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Debug.Print "当前绑定用户总数: " & m_oServer.CountUsers
End Sub

👥 CountGroups 属性

说明

获取当前已创建的组数量(只读)。通过 AddGroup 方法创建的组会计入此计数。

语法

vb
Property Get CountGroups() As Long

使用示例

vb
' 显示当前组数量
Debug.Print "当前组数量: " & m_oServer.CountGroups

' 初始化时创建默认组
Private Sub InitializeGroups()
    If m_oServer.CountGroups = 0 Then
        m_oServer.AddGroup "Default"
        m_oServer.AddGroup "Admins"
    End If
End Sub

📦 PacketHandler 属性

说明

获取或设置封包协议处理器对象。每个 cWinsock 实例持有独立的协议实例,多客户端互不干扰。

语法

vb
Property Get PacketHandler() As cPacketProtocol
Property Set PacketHandler(ByVal Value As cPacketProtocol)

使用示例

vb
' 高级配置:直接操作协议对象
Dim oProtocol As cPacketProtocol
Set oProtocol = New cPacketProtocol
oProtocol.ProtocolType = ppLengthHeader
oProtocol.HeaderBytes = 4
oProtocol.Endian = eeBigEndian

Set m_oServer.PacketHandler = oProtocol

📦 PacketProtocol 属性

说明

快速设置封包协议类型。设置后自动创建协议处理器(如果不存在)。设为 ppNone 则禁用协议。

语法

vb
Property Get PacketProtocol() As PacketProtocolType
Property Let PacketProtocol(ByVal Value As PacketProtocolType)

常量说明
ppNone0无协议(默认)
ppDelimiter1字符分隔符协议
ppFixedLength2定长协议
ppLengthHeader3长度头协议

使用示例

vb
' 设置分隔符协议
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf

' 设置长度头协议
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderBytes = 4

' 禁用协议
m_oServer.PacketProtocol = ppNone

📦 Delimiter 属性

说明

设置或获取字符分隔符协议的分隔符。默认为 vbCrLf。仅在 PacketProtocol = ppDelimiter 时有效。

语法

vb
Property Get Delimiter() As String
Property Let Delimiter(ByVal Value As String)

使用示例

vb
' 使用换行符作为分隔符(适合文本行协议)
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf

' 使用空字符作为分隔符(适合二进制文本混合协议)
m_oServer.Delimiter = vbNullChar

' 使用自定义分隔符
m_oServer.Delimiter = "<EOF>"

📦 FixedLength 属性

说明

设置或获取定长协议的消息长度。仅在 PacketProtocol = ppFixedLength 时有效。

语法

vb
Property Get FixedLength() As Long
Property Let FixedLength(ByVal Value As Long)

使用示例

vb
' 每条消息固定 256 字节
m_oServer.PacketProtocol = ppFixedLength
m_oServer.FixedLength = 256

📦 HeaderBytes 属性

说明

设置或获取长度头协议的头字节数。2 表示使用 Integer(最大 65535 字节),4 表示使用 Long。默认为 4。仅在 PacketProtocol = ppLengthHeader 时有效。

语法

vb
Property Get HeaderBytes() As Long
Property Let HeaderBytes(ByVal Value As Long)

说明最大消息长度
22字节头(Unsigned Integer)65,535 字节
44字节头(Unsigned Long)2,147,483,647 字节

使用示例

vb
' 小消息用2字节头节省带宽
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderBytes = 2

' 大消息用4字节头
m_oServer.HeaderBytes = 4

📦 HeaderEndian 属性

说明

设置或获取长度头协议的字节序。默认为小端(eeLittleEndian)。仅在 PacketProtocol = ppLengthHeader 时有效。

语法

vb
Property Get HeaderEndian() As EndianEnum
Property Let HeaderEndian(ByVal Value As EndianEnum)

常量说明
eeLittleEndian0小端序(默认,x86/x64)
eeBigEndian1大端序(网络字节序)

使用示例

vb
' 与 Java/网络协议通信(通常用大端序)
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.HeaderEndian = eeBigEndian

📦 MaxPacketSize 属性

说明

单包最大字节数限制。长度头协议解析时,如果声明的消息长度超过此值,直接报错丢弃。防止恶意超大包声明耗尽内存。

语法

vb
Property Get MaxPacketSize() As Long
Property Let MaxPacketSize(ByVal Value As Long)

默认值

1MB(1048576 字节)

使用示例

vb
' 调整最大包限制
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.MaxPacketSize = 524288  ' 512KB

' 新客户端自动继承此配置

注意事项

  • 仅对 ppLengthHeader 协议有效
  • 超限时抛出明确错误信息
  • 新客户端自动继承服务器的配置

📦 MaxBufferSize 属性

说明

接收缓冲区累积上限。Decode 合并缓冲区前检查,超过此值则报错丢弃。防止大量不完整包慢慢吃内存(如攻击者发送大量不完整包)。

语法

vb
Property Get MaxBufferSize() As Long
Property Let MaxBufferSize(ByVal Value As Long)

默认值

4MB(4194304 字节)

使用示例

vb
' 调整缓冲区上限
m_oServer.PacketProtocol = ppLengthHeader
m_oServer.MaxBufferSize = 8388608  ' 8MB

注意事项

  • 对所有协议类型有效
  • 超限时抛出明确错误信息
  • 新客户端自动继承服务器的配置

💓 Heartbeat 属性

说明

获取心跳管理器对象,用于高级配置。心跳管理器内嵌 cTimer 自动驱动,无需外部定时器。

语法

vb
Property Get Heartbeat() As cHeartbeat

使用示例

vb
' 高级配置
If Not m_oServer.Heartbeat Is Nothing Then
    Debug.Print "心跳已发送次数: " & m_oServer.Heartbeat.HeartbeatCount
    Debug.Print "定时器间隔: " & m_oServer.Heartbeat.TimerInterval & "ms"
End If

💓 AutoHeartbeat 属性

说明

启用或禁用自动心跳。启用后内嵌 cTimer 自动驱动,无需外部定时器或 PollHeartbeat() 调用。

语法

vb
Property Get AutoHeartbeat() As Boolean
Property Let AutoHeartbeat(ByVal Value As Boolean)

使用示例

vb
' 服务端:启用心跳检测
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 120  ' 2分钟超时

' 客户端:启用心跳保活
m_oClient.AutoHeartbeat = True
m_oClient.HeartbeatInterval = 50  ' 50秒间隔

' 禁用心跳
m_oServer.AutoHeartbeat = False

💓 HeartbeatTimeout 属性

说明

服务端心跳超时秒数。客户端空闲时间超过此值将被自动断开。默认 120 秒(2 分钟)。仅在服务器模式且 AutoHeartbeat = True 时有效。

语法

vb
Property Get HeartbeatTimeout() As Long
Property Let HeartbeatTimeout(ByVal Value As Long)

使用示例

vb
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 180  ' 3分钟超时

💓 HeartbeatInterval 属性

说明

客户端心跳间隔秒数。当空闲时间超过此值,客户端自动发送心跳包。默认 50 秒。仅在客户端模式且 AutoHeartbeat = True 时有效。

语法

vb
Property Get HeartbeatInterval() As Long
Property Let HeartbeatInterval(ByVal Value As Long)

使用示例

vb
m_oClient.AutoHeartbeat = True
m_oClient.HeartbeatInterval = 30  ' 30秒无活动则发心跳

💓 HeartbeatData 属性

说明

心跳包内容(字节数组)。默认为单字节 &H00。可根据协议自定义心跳包格式。

语法

vb
Property Get HeartbeatData() As Byte()
Property Let HeartbeatData(ByRef Value() As Byte)

使用示例

vb
' 自定义心跳包内容
Dim baHB(0 To 3) As Byte
baHB(0) = &HFF
baHB(1) = &H0
baHB(2) = &H0
baHB(3) = &HFF
m_oClient.HeartbeatData = baHB

💓 IdleSeconds 属性

说明

当前连接的空闲秒数(只读)。从最后一次收发数据开始计算。可用于判断连接活跃度。

语法

vb
Property Get IdleSeconds() As Long

使用示例

vb
' 检查客户端活跃度
Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
    Debug.Print oClient.Tag & " 空闲: " & oClient.IdleSeconds & "秒"
Next

📌 属性使用场景总结

客户端常用属性

vb
' 连接前设置
m_oClient.Protocol = sckTCPProtocol
m_oClient.RemoteHost = "192.168.1.100"
m_oClient.RemotePort = 8080
m_oClient.Connect

' 连接后获取
Debug.Print "IP: " & m_oClient.RemoteHostIP
Debug.Print "端口: " & m_oClient.RemotePort
Debug.Print "状态: " & m_oClient.State

' 自定义标签
m_oClient.Tag = "客户端-001"
m_oClient.UserData = "用户信息"

服务器常用属性

vb
' 启动服务器
m_oServer.Protocol = sckTCPProtocol
m_oServer.LocalPort = 8080
m_oServer.Listen

' 设置封包协议
m_oServer.PacketProtocol = ppDelimiter
m_oServer.Delimiter = vbCrLf

' 设置心跳
m_oServer.AutoHeartbeat = True
m_oServer.HeartbeatTimeout = 120

' 管理客户端
Debug.Print "连接数: " & m_oServer.ClientCount

Dim oClient As cWinsock
For Each oClient In m_oServer.Clients
    Debug.Print oClient.Tag & ": " & oClient.RemoteHostIP & " (空闲" & oClient.IdleSeconds & "秒)"
    oClient.SendData "广播消息"
Next

最后更新: 2026-06-09

VB6及其LOGO版权为微软公司所有