winsocket发送数据,在1024字节以上就会分开发送。我在接收端取的数据也只有1024字节。用WPE抓包能看到后面的包是分多次传输的。于是我设计了一个过程,如果数据内容不符合要求,就缓存到一个字节组中,直到数据收完。可是测试后发现,程序只收到这1024字节后,就得不到后面的数据了。倒是能收到下一个数据的包。请问用什么办法可以解决呢?

解决方案 »

  1.   

    收到数据:
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim sda() As Byte
    Winsock1.GetData sda
    End Sub
    把数据传递给sendG
    Private Sub sendG(sda() As Byte)
    Dim i As Integer, l As Long
    CopyMemory i, sda(UBound(sda) - 1), 2
    Print Hex(i)
    If i = &HAA55 And hcun = 0 Then
    sendC sda
    Else
    l = hcun + UBound(sda) + 1
    ReDim Preserve s1(l - 1)
    CopyMemory s1(hcun), sda(0), UBound(sda) + 1
     If i = &HAA55 Then
     sendC s1
     hcun = 0
     Else
     hcun = l
     End If
    End If
    End Sub
    因为完整的数据都是以AA55结尾,所以先判断结尾是不是AA55,如果不是就把数据累加到字节组s1,直到收到的数据结尾是AA55时,把数据传给sendC。代码应该没有出错,不大于1024的数据包全都通过了。只是大于1024的封包,根本没有收到后面的数据。也就是sendG得不到,所以没有处理动作。
      

  2.   

    有人说用PeekData 收的数据比较全,就是不能清空缓冲区。所以先用PeekData ,然后再用GetData 
    既然这样,先把全的数据取到sda,然后用GetData 再取一次,因为可能不完整,所以不应该再取到sda了对吧。我用GetData 取到另一个变量,测试结果还不行。我就把GetData也取到变量sda,重复之后竟然可以了。不知道什么原因
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim sda() As Byte
    Winsock1.PeekData sda
    Winsock1.GetData sda
    End Sub
    其实是服务端故意把这个包给拆开了,因为我中间有收到数据是7K多,是一个包。所以证明VB6的winsock控件,默认缓冲区不是1024.拆开的包应该是分两次收到。可实际情况可能不是这样。
      

  3.   

    没发现WINSOCK有这么多问题,觉得挺好用啊.http://www.m5home.com/bak_blog/article/169.html我之前做的一个测试,你可以参考一下.
      

  4.   

    S1数组是全局变量,代码里看不到的变量都在全局变量里。
    不管用什么办法,都取不到完整那个数据包,而且我测试时,收到的包有10K以上的,也觉得奇怪啊
    有人说winsocket默认缓冲区是8K。看来这个问题不是数据包长度的问题,
    既然这么长的包都能收到,可问题是那一个包,是服务端分两“段”发送,我程序只能收到前面部分。
    但用WPE抓包却能看到后面那部分。真是百思不得其解。