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的屬性,也不至於浪費這么多時間.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM