winsock SPLIT 数组

Posted

技术标签:

【中文标题】winsock SPLIT 数组【英文标题】:winsock SPLIT array 【发布时间】:2013-09-06 15:29:26 【问题描述】:

我的服务器上有这段代码,用于创建更新消息

StrMsg = "1~Server~"

For x = 0 To Combo1.ListCount - 1
    If x = Combo1.ListCount - 1 Then
        StrMsg = StrMsg & Combo1.List(x)
    Else
        StrMsg = StrMsg & Combo1.List(x) & "~"
    End If
Next x


' send it to every connected clients
For x = 0 To clientCounter - 1
    sckClients(x).SendData StrMsg
Next x

客户端会收到然后放到ComboBox1上

Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    Dim strMsg As String, tmp() As String, i As Integer

    sckClient.GetData strMsg$, vbString
    tmp$() = Split(strMsg$, "~")

    For i% = 1 To CInt(tmp$(0)) - 1
        Combo1.AddItem tmp$(i%)
    Next i%

    sckClient.GetData strData, vbString

End Sub

但是为什么我总是得到一个运行时错误 13 类型不匹配??

这里似乎有什么问题? -_-

【问题讨论】:

单步调试代码。特别是检查 tmp(0) 的值。如果这没有帮助,你会在哪一行得到错误? 【参考方案1】:

Split() 函数返回 String 数组类型的 Variant,而不是 String 数组。除此之外,我会删除变量的类型声明符号 - 它们是对旧版本 BASIC 的回归。

Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData    As String
    Dim strMsg     As String
    Dim vastrTmp   As Variant
    Dim i          As Integer

    sckClient.GetData strMsg, vbString
    vastrTmp = Split(strMsg, "~")

    For i = 1 To CInt(vastrTmp(0)) - 1
        Combo1.AddItem vastrTmp(i)
    Next i

    sckClient.GetData strData, vbString

End Sub

【讨论】:

【参考方案2】:

我有几个问题:

就像 jac 问:你在哪一行得到错误?

为什么要循环到 CInt(tmp$(0))-1 在您发布的代码中,您发送的字符串始终以 1~ 开头,因此 tmp$(0) 将始终为 1,因此您将从 1 查找到 0(永远不会)

为什么在 DataArrival 结束时又调用 GetData ?

使用带有 split() 的字符串数组效果很好,我什至比使用变体更喜欢它。 使用变量声明总是一件好事:它使您的代码更易于阅读,并且在未声明变量时使用(慢)变体时,VB 会稍微加快速度

据我所知,唯一的类型不匹配可能来自 CInt() 尽管它永远不会与您发布的代码一起到达那里

用 Val() 替换 CInt(),你不应该再得到类型不匹配,但注意任何非数字值都会被转换为 0

这就是说:我用你的代码创建了一个项目并且没有得到任何类型不匹配

【讨论】:

以上是关于winsock SPLIT 数组的主要内容,如果未能解决你的问题,请参考以下文章

VB6 中的 Winsock 控件只向数组中的最后一个索引发送文本消息

WINSOCK.02.SELECT模型

VB如何使用Winsock进行1对多通信

winsock2的介绍

VBA中的winsock 和VB中的winsock可以互连吗

winsock是啥,是一门语言还是一个文件?