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程序员进阶:Java异常知识点梳理
    JVM内存模型(运行时数据区)
    史前最详细的:Java线程池核心流程解析
    10年大牛给Java 初学者的学习路线建议,如何学习 Java?
    异常处理(面试题)
    115道Java经典面试题(面中率高、全)
    Java异常处理(捕获异常)
    Java异常处理(观察常见异常)
    Java异常处理(异常基本概念)
    学习笔记:Java数组
  • 原文地址:https://www.cnblogs.com/xiii/p/7215723.html
Copyright © 2011-2022 走看看