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

socket tcp 传输大文件

  •  
  •   yss729 · 2019-09-09 16:28:28 +08:00 · 5495 次点击
    这是一个创建于 1902 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    PS: 我传的是 zip 包。

    12 条回复    2019-09-11 18:01:12 +08:00
    mhycy
        1
    mhycy  
       2019-09-09 16:34:51 +08:00   ❤️ 1
    检查代码,最后一段分片没有正常写入
    VDimos
        2
    VDimos  
       2019-09-09 16:37:01 +08:00 via Android   ❤️ 1
    一台电脑走的回环吗?
    如果是可能会出现最后一片分片没有获取到
    misaka19000
        3
    misaka19000  
       2019-09-09 16:42:41 +08:00
    算一下 md5 是否一样
    yss729
        4
    yss729  
    OP
       2019-09-09 16:46:02 +08:00
    @VDimos 一台电脑分别运行 client 和 server 端 , 可能是最后一片分片的问题,但为什么同一台电脑却能通过?
    podel
        5
    podel  
       2019-09-09 16:55:41 +08:00
    算 md5 对比一下。
    分段算 md5 对比一下。 可以看看哪段有问题。
    也可以在程序里面 没传一片 输出 md5,或者保存 md5 调试 看看问题是哪一片有问题。
    reus
        6
    reus  
       2019-09-09 16:58:17 +08:00
    @yss729 总之你的代码是错的,本地可以,只是偶然现象,不是必然,所以没必要探讨为什么能通过。
    yss729
        7
    yss729  
    OP
       2019-09-09 17:01:38 +08:00
    @mhycy @VDimos 感谢各位大神,确实是最后一段分片的判断写错了!
    yss729
        8
    yss729  
    OP
       2019-09-09 17:07:34 +08:00
    @reus 是这么个道理!
    arloor
        9
    arloor  
       2019-09-09 17:23:00 +08:00
    能说下原来错的情况的代码吗,想 mark 一下
    opengps
        10
    opengps  
       2019-09-09 17:47:36 +08:00
    以前帮同学改过一段,他最后一段大小没处理,被文件流填充了跟前面设置的缓冲区大小一样大了
    labnotok
        11
    labnotok  
       2019-09-09 17:50:45 +08:00 via Android
    大小端?
    yss729
        12
    yss729  
    OP
       2019-09-11 18:01:12 +08:00
    @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 的长度一致,才算完成
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:10 · PVG 13:10 · LAX 21:10 · JFK 00:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.