使用Winsock,服务器端收到客户端的数据包后,发确认码给客户端,客户端发送新的数据包。问题:服务器端有时不规则重复收到客户端所发来的数据,部分代码如下,请问诸位是什么原因?Private Sub WinRev_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim buffer1() As Byte, strin As String, buffer As String
        WinRev(Index).GetData buffer1, vbArray + vbByte, bytesTotal
        Dim nn, si As Integer
        Dim strin2 As String
        strin2=""
        For si = 0 To bytesTotal
             strin2 = strin2 & buffer1(si) & "|"  'strin2 为收到的数据,有时会不规格收到重复的数据。
        Next         sendstr = "&h4,&h5,&h4"    '收到CLIENT发来的数据后,发送确认码
           sData = Split(sendstr, ",")
          ReDim buffsend(3)
          For si2 = 0 To 2
              buffsend(si2) = sData(si2)
          Next
          WinRev(Index).SendData buffsend   '发送确认码 多谢诸位!请帮忙给予修正。

解决方案 »

  1.   

    是不是UDP协议??是的话你的网络有问题
      

  2.   

    使用Winsock太落后了,建议使用:wininet.dll控件。
      

  3.   

    C/S两端的数据发送规则是怎么样的?或者说是S端先向C端请求还是C一旦有数据,只要发现S开机了就自动发送?
      

  4.   

    toury,您好!谢谢您的答复。
    流程如下:
    客户端发请求数据给服务器端;
    服务器端收到请求数据后,给客户端答复;
    客户端收到服务器端的确认数据后,将数据发给服务器端;
    服务器端收完后,再发收到确认码给客户端。
      

  5.   

    仔细看了一下你顶楼的代码,发现有些小问题,改了一点点:Private Sub WinRev_DataArrival(Index As Integer, ByVal bytesTotal As Long)
      Dim strData$, strFileName$, temp$
      Dim I%, lLenFile&
      Dim bytBuffer() As Byte, buffsend()
      
      ReDim bytBuffer(1 To bytesTotal&)
      
      On Error GoTo rcvErrorHandler:
      
      WinRev(Index).GetData bytBuffer, vbArray + vbByte, bytesTotal
      
      strData = ""
      
      '数据写入硬盘,每小时换一个文件名
      temp = Split(Time, ":")(0)
      temp = Date & "_" & temp
      strFileName = App.Path & "\" & temp & ".szy"
      
      Open strFileName For Binary As #f
      lLenFile = LOF(f)
      
      If lLenFile = 0 Then 'lLenFile=0表示是第一次打开文件
        Put #f, 1, bytData
      Else
        Put #f, lLenFile + 1, bytData
      End If
      Close #f
      
      'For I = 0 To bytesTotal
      '  strData = strData & bytBuffer(I) & "|" 'strData为收到的数据,有时会不规格收到重复的数据。
      'Next
      
    '  sendstr = "&h4,&h5,&h4"     '收到CLIENT发来的数据后,发送确认码
    '    sData = Split(sendstr, ",")
    '  ReDim buffsend(2)
    '  For I = 0 To 2
    '      buffsend(I) = sData(I)
    '  Next
      
      On Error Resume Next '因为数据已保存,所以此时坚决发送确认码
      
      ReDim buffsend(2)
      buffsend = Array(&H4, &H5, &H4)
      '发送确认码
      '现在的问题是:
      '1)如果此时网络阻塞,下面的确认发不出去(或延迟超过3秒发出怎么办)
      '2)C端最好在每发一个包后PAUSE一下,或者包头有变化,才能避免数据报粘连;但你又没办法控制:))
      WinRev(Index).SendData buffsend
      
      Exit Sub
      
    rcvErrorHandler:
      'MsgBox Err.Description
      '把错误写到一个文件
      '........
      '........
      Err.Clear
    End Sub
      

  6.   

    上面发错了,重发Private Sub WinRev_DataArrival(Index As Integer, ByVal bytesTotal As Long)
      Dim strData$, strFileName$, temp$
      Dim I%, lLenFile&
      Dim bytBuffer() As Byte, buffsend()
      
      On Error GoTo rcvErrorHandler:
      
      ReDim bytBuffer(1 To bytesTotal&)
      WinRev(Index).GetData bytBuffer, vbArray + vbByte, bytesTotal
      
      '数据写入硬盘,每小时换一个文件名
      temp = Split(Time, ":")(0)
      temp = Date & "_" & temp
      strFileName = App.Path & "\" & temp & ".szy"
      
      Open strFileName For Binary As #f
      lLenFile = LOF(f)
      
      If lLenFile = 0 Then 'lLenFile=0表示是第一次打开文件
        Put #f, 1, bytBuffer
      Else
        Put #f, lLenFile + 1, bytBuffer
      End If
      Close #f
      
      On Error Resume Next '因为数据已保存,所以此时坚决发送确认码
      
      ReDim buffsend(2)
      buffsend = Array(&H4, &H5, &H4)
      '发送确认码
      '现在的问题是:
      '1)如果此时网络阻塞,下面的确认发不出去(或延迟超过3秒发出怎么办)
      '2)C端最好在每发一个包后PAUSE一下,或者包头有变化,才能避免数据报粘连;但你又没办法控制:))
      WinRev(Index).SendData buffsend
      
      Exit Sub
      
    rcvErrorHandler:
      'MsgBox Err.Description
      '把错误写到一个文件
      '........
      '........
      Err.Clear
    End Sub
      

  7.   

    感谢 toury 花了几十分钟给予信息交谈指导!也感谢以上诸位!
      

  8.   

    多谢 toury 帮忙修正代码!再次感恩!