首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  .NET

socket tcp 传输大文件

  •  
  •   yss729 · 74 天前 · 1780 次点击
    这是一个创建于 74 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题现象: 同一台电脑测试文件传输, 无论多大的文件,都能传过去,且能正常解压。

    但放两台不同的电脑上测试,文件能传过去,但是解压提示,“不可预料的压缩文件末端” ,两边包的大小一样,文件没有缺失。

    PS: 我传的是 zip 包。

    12 回复  |  直到 2019-09-11 18:01:12 +08:00
        1
    mhycy   74 天前   ♥ 1
    检查代码,最后一段分片没有正常写入
        2
    VDimos   74 天前 via Android   ♥ 1
    一台电脑走的回环吗?
    如果是可能会出现最后一片分片没有获取到
        3
    misaka19000   74 天前
    算一下 md5 是否一样
        4
    yss729   74 天前
    @VDimos 一台电脑分别运行 client 和 server 端 , 可能是最后一片分片的问题,但为什么同一台电脑却能通过?
        5
    podel   74 天前
    算 md5 对比一下。
    分段算 md5 对比一下。 可以看看哪段有问题。
    也可以在程序里面 没传一片 输出 md5,或者保存 md5 调试 看看问题是哪一片有问题。
        6
    reus   74 天前
    @yss729 总之你的代码是错的,本地可以,只是偶然现象,不是必然,所以没必要探讨为什么能通过。
        7
    yss729   74 天前
    @mhycy @VDimos 感谢各位大神,确实是最后一段分片的判断写错了!
        8
    yss729   74 天前
    @reus 是这么个道理!
        9
    arloor   74 天前
    能说下原来错的情况的代码吗,想 mark 一下
        10
    opengps   74 天前
    以前帮同学改过一段,他最后一段大小没处理,被文件流填充了跟前面设置的缓冲区大小一样大了
        11
    labnotok   74 天前 via Android
    大小端?
        12
    yss729   72 天前
    @arloor 抱歉,才看见,我用的是 supersocket

    // 临时缓冲区
    private byte[] TempBuffer = null;

    public BinaryRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest){
    // length 是每一次传过来的数据量,默认固定是 4096 个字节, 我是边传边往 TempBuffer 里写,在判断最后一个包的时候我是判断 if(length<4096) 我以为这样判断应该不会有误,实际上就是这里的问题。 应该是要累计每次传过来的 Length 与 TempBuffer 的长度一致,才算完成
    }
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1201 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 18:04 · PVG 02:04 · LAX 10:04 · JFK 13:04
    ♥ Do have faith in what you're doing.