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的属性,也不至于浪费这么多时间.

  • 相关阅读:
    Java JDBC 连接ORACLE ORA-12505错误解决方法
    SqlServer 打开/关闭列自增
    【小程序】倒计时
    【MySQL 主从同步延迟的原因及解决办法】
    【Linux Mysql主从配置】整理主从配置遇到的坑!
    关于post和get传递参数的区别
    CSS基础属性介绍
    js-06-字符串
    js-07-事件
    js-08-数组学习
  • 原文地址:https://www.cnblogs.com/xiii/p/7215723.html
Copyright © 2011-2022 走看看