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