此断代码是c/s的客户端,发送接收用的是同一个winsok1
winsock用的是TCP/IP协议
private sendfile()
    ................
    '折包发送文件
    For i = 0 To LngFile
       ReDim FileByte(1023) As Byte
       Open sFile For Binary As #FileNum
       Get #FileNum, i * 1024 + 1, FileByte
       Close #FileNum
       winsok1.SendData FileByte
       Call Delay(100)  '延时
   Next.................
end sub
Private Sub winsok1_DataArrival(ByVal bytesTotal As Long)
   ##################奇怪的现象
   当调用sendfile()发送文件时,如果文件没有发送完,这时winsok1如果收到 发过来的消息,会DataArrival事件,但读这个消息,发现还是在发送文件之前,收到的那条旧消息,
直接文件发送完毕,又会再一次触发DataArrival,才能得到后来收到的消息,什么原因?
End Sub
Public Function Delay(ByVal n As Long)
 Dim T1     As Long, T2     As Long
  T1 = GetTickCount: T2 = GetTickCount
  Do Until T2 - T1 >= n
    T2 = GetTickCount: DoEvents: Sleep 1
  Loop
End Function

解决方案 »

  1.   

    好象和CopyMemory有关,在接收数据时不用他就好了,为什么呢?
    哪们老大解析一下?!
      

  2.   

    '缓存数组
    Dim SeqByteArray() As Byte  '全局变量Private Sub smsClient_DataArrival(ByVal bytesTotal As Long)   Dim TempByteArray() As Byte
       Dim RemainByteArray()  As Byte
       Dim sDateByte() As Byte
       '全部读取缓冲区中的数据
       smsClient.GetData sDateByte, vbArray + vbByte, bytesTotal
       
       
       If StrPtr(SeqByteArray) = 0 Then
          '没有初始化
           ReDim SeqByteArray(UBound(sDateByte))
           CopyMemory SeqByteArray(0), sDateByte(0), UBound(sDateByte) + 1
       Else
         '己经初始化
           Dim SeByteArrayUbound As Long
           SeByteArrayUbound = UBound(SeqByteArray)
           ReDim Preserve SeqByteArray(SeByteArrayUbound + UBound(sDateByte) + 1)
           CopyMemory SeqByteArray(SeByteArrayUbound + 1), sDateByte(0), UBound(sDateByte) + 1
       End If
          
       '数据包的长度
        Dim PakLenByte(3) As Byte
        Dim PakLenByteLen As Integer
        
        If UBound(SeqByteArray) >= 3 Then
            CopyMemory PakLenByte(0), SeqByteArray(0), 4
            PakLenByteLen = ByteArrayToInt(PakLenByte)
        Else
            Exit Function
        End If
        
        
        Do While (PakLenByteLen <= UBound(SeqByteArray) + 1)
           
           '开始拆包
           ReDim TempByteArray(0 To PakLenByteLen - 1) As Byte
           CopyMemory TempByteArray(0), SeqByteArray(0), PakLenByteLen
           
           '得到一个完整的包,对消息进行分类处理分析
           Call DataAnalytic(TempByteArray)
           
           Erase TempByteArray '################清理内存
           
           '把剩余的字节,重新放回SeqByteArray中
           
            If UBound(SeqByteArray) + 1 - PakLenByteLen > 0 Then
               '说明有取走该包之后,还有其他包的数据
                
                ReDim RemainByteArray(UBound(SeqByteArray) + 1 - PakLenByteLen - 1)
                CopyMemory RemainByteArray(0), SeqByteArray(PakLenByteLen), UBound(SeqByteArray) + 1 - PakLenByteLen
                
                
                ReDim SeqByteArray(UBound(SeqByteArray) + 1 - PakLenByteLen - 1)
                
                CopyMemory SeqByteArray(0), RemainByteArray(0), UBound(RemainByteArray) + 1
                
                Erase RemainByteArray '######################清理内存
                
                '重新计算包的长度
                If UBound(SeqByteArray) >= 3 Then
                    CopyMemory PakLenByte(0), SeqByteArray(0), 4
                    PakLenByteLen = ByteArrayToInt(PakLenByte)
                Else
                    Exit Do  '退出循环
                End If
                
            Else
                Erase SeqByteArray  '清除占用的内存地址
                Exit Do  '退出循环
            End If
        Loop
        
       
       
    End Function
      

  3.   

    End Function 写错了是end sub 上面是接收数据部分,
    各位大哥帮看看,哪有问题,多谢
      

  4.   

    感觉好象是在DataArrival方法中用了CopyMemory之后 和 winsock缓冲区有冲突,晕死
      

  5.   

    在循环中加个DOEVENTS试试.可能是系统没来得及处理.