服务器-->中转站(转发程序)--->三台客户端(固定的)
当程序开始运行的时候,中转站能给与其保持连接的三台客户端正常转发数据;如果在一次转发数据完成后,其中一台客户端与中转站断开连接,中转站仍能将数据转发给其他两个客户端.
但当中转站在一次数据转发过程中,突然与一台客户端失去连接后,与另外两台仍保持连接,但是另两台也接受不到数据.Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str1() As Byte '字节型数组
Dim i As Integer
Winsock1.GetData str1(), vbArray + vbByte '从服务器接受数据
If sock1.State = sckConnected Then '给客户端1转发数据
sock1.SendData str1()
End If
If sock2.State = sckConnected Then '给客户端2转发数据
sock2.SendData str1()
End If
If sock3.State = sckConnected Then '给客户端2转发数据
sock3.SendData str1()
End If
For i = 1 To bytesTotal
Text1.Text = Text1.Text & str1(i - 1) & " " '在文本里显示接受到数据
Next i
End Sub客户端正常接受到转发数据后也显示在文本的

解决方案 »

  1.   

    "突然与一台客户端失去连接"----这种异常Socket是不会立刻捕获的, 得在大概20秒之后Socket才会认为连接出现异常, 在这20秒内, 你的程序还会向这个异常的连接发送数据, 从而导致你所描述的问题。
      

  2.   

    这类不是很稳定的传输机制中最好加入缓冲池功能。简单点,用文件做缓冲。
    转发程序见接收功能独立出来,每次收到数据就生成一个文件,对应3个客户端,那么把文件复制到3个目录中。
    转发程序中的发送功能也独立出来,而且完全可以一个程序实例对应一个客户端;它定时扫描某个目录,有文件就发送,然后删除文件。数据流向示意图为:
    Socket->接收程序->文件目录*n
    文件目录*1->发送程序->Socket这样的接收、发送程序是通用的,完全可以应用到服务端、客户端。而且通过简单的配置增减客户端、增减中转站都很方便。