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

  • 相关阅读:
    如何写好软件需求说明?
    怎么做,与为什么?[转]
    WCF学习中遇到的一些问题
    删除数据库中所有表、视图以及存储过程
    如何获取Repeater的当前行号
    Asp.Net 获取FileUpload控件的文件路径、文件名、扩展名
    IP地址通过WebService得到城市
    springboot、intellij与docker的结合
    开源GIS软件初探
    Statement接口提供的execute、executeQuery和executeUpdate之间的区别
  • 原文地址:https://www.cnblogs.com/xiii/p/7215723.html
Copyright © 2011-2022 走看看