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