zoukankan      html  css  js  c++  java
  • VB中Winsock连续发送出现接收不到的异常问题解决方法

    VB里面用WINSOCK进行一对多连接的TCP连接时,经常需要群发消息给所有已连接的客户端.代码类似如下:

    Option Explicit
    Dim bytMsg() As Byte
    Private Sub Command1_Click()
    For i = 0 To WSock.Count - 1
        WSock(i).SendData bytMsg
    Next i
    End Sub

    运行上面的代码发现,有时只有最后一个WINSOCK的客户端收到了消息,其他都没有收到.

    PS:郁闷了好久,意外的发现当点击以下暂停,然后再点击运行,其他客户端又收到了消息...

    网络上没有搜到太多的资料,所以下面给出三种解决方案,均测试通过:

    第一种:根据网络找到的资料使用神奇的DOEVENTS,但是一般多连接的应用场景都比较复杂,可能会出现意料之外的后果.

    Option Explicit
    Dim bytMsg() As Byte
    Private Sub Command1_Click()
    For i = 0 To WSock.Count - 1
        If WSock(i) = sckConnected Then
            WSock(i).SendData bytMsg
            DoEvents
        End If
    Next i
    End Sub

    第二种:忐忑是最让人难受的,为了保证稳定性,我又在MSDN仔细的翻遍了WINSOCK所有的属性/方法/事件来看,当看到SocketHandle属性的时候眼前一亮

    果断声明SOCKET的API > SEND,结果让人满意.

    而且这回还可以发送一段byte()中的某一部分,

    不像Winsock.SendData只能发送一整个byte(),片段只能先Redim byte(n),然后再CopyMemory进去,最后再发送...

    Option Explicit
    Dim bytMsg() As Byte
    Private Declare Function send Lib "ws2_32.DLL" (ByVal socket As Long, _
                                                    Buf As Any, _
                                                    ByVal buflen As Long, _
                                                    ByVal Flags As Long) As Long
    Private Sub Command1_Click()
    For i = 0 To WSock.Count - 1
        If WSock(i) = sckConnected Then
            send WSock(i).SocketHandle, bytMsg(0), UBound(bytMsg) + 1, 0
        End If
    Next i
    End Sub

    第三种:祈祷!哈哈~

    -----------------------------------

    哎,早我就该仔细看看winsock的属性,也不至于浪费这么多时间.

  • 相关阅读:
    VMware虚拟机安装
    软件测试面试题汇总
    软件测试步骤详解
    软件测试的分类&软件测试生命周期
    BUG 的生命周期
    Jmeter连接Mysql数据库
    Navicat连接Mysql报错:Client does not support authentication protocol requested by server;
    Mysql安装(win10 64位)
    Jmeter生成测试报告
    (转)Jmeter http请求之content-type
  • 原文地址:https://www.cnblogs.com/xiii/p/7215723.html
Copyright © 2011-2022 走看看