socket tcp 传输大文件

2019-09-09 16:28:28 +08:00
 yss729

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

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

PS: 我传的是 zip 包。

5528 次点击
所在节点    .NET
12 条回复
mhycy
2019-09-09 16:34:51 +08:00
检查代码,最后一段分片没有正常写入
VDimos
2019-09-09 16:37:01 +08:00
一台电脑走的回环吗?
如果是可能会出现最后一片分片没有获取到
misaka19000
2019-09-09 16:42:41 +08:00
算一下 md5 是否一样
yss729
2019-09-09 16:46:02 +08:00
@VDimos 一台电脑分别运行 client 和 server 端 , 可能是最后一片分片的问题,但为什么同一台电脑却能通过?
podel
2019-09-09 16:55:41 +08:00
算 md5 对比一下。
分段算 md5 对比一下。 可以看看哪段有问题。
也可以在程序里面 没传一片 输出 md5,或者保存 md5 调试 看看问题是哪一片有问题。
reus
2019-09-09 16:58:17 +08:00
@yss729 总之你的代码是错的,本地可以,只是偶然现象,不是必然,所以没必要探讨为什么能通过。
yss729
2019-09-09 17:01:38 +08:00
@mhycy @VDimos 感谢各位大神,确实是最后一段分片的判断写错了!
yss729
2019-09-09 17:07:34 +08:00
@reus 是这么个道理!
arloor
2019-09-09 17:23:00 +08:00
能说下原来错的情况的代码吗,想 mark 一下
opengps
2019-09-09 17:47:36 +08:00
以前帮同学改过一段,他最后一段大小没处理,被文件流填充了跟前面设置的缓冲区大小一样大了
labnotok
2019-09-09 17:50:45 +08:00
大小端?
yss729
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 的长度一致,才算完成
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/599357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX