我用winsock的senddata发送一个结构体:Public Type tPack
    
    eCMD As eCommand        
    iDisTime As Date         '8
    iConTime As Date         '8
    iStep As Long           '4
    lTotalLength As Long    '4
    lSendLength As Long     '4
    iID As Long          '4
    bFilepack(4095) As Byte
End Type
dim temp as tPack
发送代码:
            CopyMemory gdata(0), temp, iType
            Sock.SendData gdata
在客户机上接收数据,大多数情况,一次DATAARRIVAL过程可以正常接收4132个字节,但是有较高的概率出现先接收到第一个包2920字节,再接收到包1212个字节。
请指教如下问题:
1.这种偶然分包情况是什么原因导致?
2.如何避免这个情况
3.是否有更佳替代方案?

解决方案 »

  1.   

    这是由内部默认的接收缓冲区决定的。
    如果想修改缓冲区,则可以使用API来代替控件,网上有许多关于winsock的API以及关于修改缓冲区的大小的代码,你GOOGLE一下就可以了。
      

  2.   

    换成API的话,整个程序要重新写,时间来不及了。
      

  3.   

    要自己用标志位分包,不要指望那个默认的4k大小
    4k只是你的缓冲区,真正分包的个数由你的网络决定
    如果网络不好,4k被分成10个包都有可能,因为vb的winsock实现是每recv一次就触发一次data_arrival事件的
      

  4.   

    用你的 lSendLength 与实际收到的字节数比较,就能知道是否全部接收。
      

  5.   

    首先说明一下,4132 这个数字是随着你的网络情况变化而变化的,那么这个值的变化范围是多少?我们在这里不讨论所以如果传大数据时,我给LZ的建议是,发送的时候,在数据包头部加入这个文件的总大小,然后在接收方,判断每次进来的数据总和是否等于这个文件的总大小了,如果等于了,那么就接收完毕了,没有的话就继续接收,LZ在做此类工程时,注意:当利用TCP自动发包原理时,一定注意第二次的包里面是没有你第一次发送的自定义包头它只有数据!!!