我是在做一个软件自动升级的服务程序,用WINSOCK做的,在客户端下载小文件,或文本文件的时候,基本没问题,但下载大文件和其他非文本文件的时候都错的。
原因是比如读一个EXE文件,必须用二进制的方式打开,
Open FileName For Binary Access Read As #FileHandle如果中间不做任何处理,在客户端用二进制方式收也没问题,我在本机传送几十MB的EXE文件,也行。但为了处理错误,我在每个数据段前加了当前的段序列号,然后在客户端根据段序列号处理,就碰到问题:
Tmp = SendID(index) & "**##**##"
        SendSize = Block_size - Len(Tmp)
        If (LOF(FileHandle) - Loc(FileHandle)) = 0 Then Exit Sub
            If (LOF(FileHandle) - Loc(FileHandle)) < Block_size Then
                SendSize = (LOF(FileHandle) - Loc(FileHandle))
                ReDim MySend(0 To SendSize - 1)
                Get #FileHandle, , MySend
                Winsk1(index).SendData Tmp
                Winsk1(index).SendData MySend
                DoEvents
在发送端把序列放在段前面发送,在接受端进行处理
怎么把字符串从二进制的数据段中分离出来?????
我进行了2次转换先整个转成STR,然后分离,再转成BYTE,转回来之后就不对了,我用了许多转换函数,转回来都不对,
用 Tmp = StrConv(arrdata, vbUnicode) '字符转换
去掉头,然后
    arrdata = StrConv(Tmp, vbFromUnicode)
还有其他不下10个转换函数,都不行,但如果原始文件是文本,就没有问题。而且经过2次转,速度慢得比美蜗牛。
该怎么办??
相应的原码和文章在VB基础类,二进制文件追加写入问题,分都快用完了
http://topic.csdn.net/u/20080311/12/1c43c2ae-eddb-4ff3-b16a-7cd0c275e850.html

解决方案 »

  1.   

    还有半个包丢哪里了?
    发送端长度是8192,在接受端只收到4380,按理在下一个Winsk1_DataArrival()中能受到3812,有时能收到,有时候怎么
    Winsk1_DataArrival()不触发了呢?还有3812丢哪里了?
      

  2.   

    终于基本完成了这个功能,期间走了很多弯路。感谢许多朋友们的指点和帮助。感谢CSDN,现在内网的下载速度是2M/秒左右,能接受了,外网要慢慢调试了。