免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: Third-Edition

[C] 自己写的函数进行拷贝/上传文件,部分文件副本会损坏是什么原因 [复制链接]

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
发表于 2013-07-29 15:07 |显示全部楼层
回复 7# Third-Edition


    我到是没遇到过http实体被\r\n包围的情况,因为实体都是在最后的。
    如果当实体后面没有\r\n,那你最后就像我在四楼说的那样,结束没有\r\n,你readline怎么保证读取完整。
    还在在读取实体的时候,你是否可以换个函数,而不用readline读取呢,为何要死也要用readline!
    http头域里应该有实体的长度,在读取完成的时候可以检验下。或者读取的时候直接按实体长度读取。

论坛徽章:
26
CU大牛徽章
日期:2013-03-13 15:15:08水瓶座
日期:2014-08-31 19:44:01卯兔
日期:2014-09-05 08:48:33摩羯座
日期:2014-09-07 13:03:35子鼠
日期:2014-09-10 08:42:36白羊座
日期:2014-09-20 12:39:07丑牛
日期:2014-09-24 07:35:252015年亚洲杯之阿联酋
日期:2015-02-03 17:42:542015年亚洲杯之卡塔尔
日期:2015-02-11 13:13:022015年亚洲杯之约旦
日期:2015-03-03 15:10:522015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之卡塔尔
日期:2015-03-27 14:08:09
发表于 2013-07-29 15:36 |显示全部楼层
本帖最后由 Third-Edition 于 2013-07-29 16:00 编辑
idi0t 发表于 2013-07-29 15:07
回复 7# Third-Edition

不对,socket不像文件,没有读取完成这种说法,不会像文件读取完返回EOF。其次确实有content-length,我就是在一个循环for(i = 0;i<content-length下面读取的。
readline是我写的带缓冲的,缓冲区被读取完或读取到\n就返回,并不是死抠着\n不放,所以不会发生说读取不到\n而导致阻塞。其次要传送文件比较大,char buf[content-length];read(sock,buf,content-length);明显不行吧?我觉得把数据读入buf,然后从buf中readline是比较合理。还有我现在发现我传送损坏的是少量二进制文件如部分的exe文件,但是把此文件压缩成rar或zip就可以成功传送了。你觉得会是什么造成的吗?

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
发表于 2013-07-29 17:17 |显示全部楼层
回复 12# Third-Edition


    恩,我指的读取完成是指读取完单个响应。按你说法一直可读,你应该使用了keep-live。
    如果你是按content-length来读取的,我觉得应该不会有问题啊,我觉得还是从问题入手,看看读取的文件和原文件有什么差异,实在有些好奇。

论坛徽章:
26
CU大牛徽章
日期:2013-03-13 15:15:08水瓶座
日期:2014-08-31 19:44:01卯兔
日期:2014-09-05 08:48:33摩羯座
日期:2014-09-07 13:03:35子鼠
日期:2014-09-10 08:42:36白羊座
日期:2014-09-20 12:39:07丑牛
日期:2014-09-24 07:35:252015年亚洲杯之阿联酋
日期:2015-02-03 17:42:542015年亚洲杯之卡塔尔
日期:2015-02-11 13:13:022015年亚洲杯之约旦
日期:2015-03-03 15:10:522015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之卡塔尔
日期:2015-03-27 14:08:09
发表于 2013-07-29 17:31 |显示全部楼层
回复 13# idi0t
等我解决了再告诉你,我定位到----------------------xxxx\r\n然后开始写文件,然后定位----------------------xxxx\r\n结束 文件的写,然后将文件屁股的\r\n截断。
发送损坏的二进制文件经过压缩后发送就不会损坏了,实在是不解啊。我用gdb调试设断点定位和计算每个过程的长度和 ,发现确实是定位到了二进制文件开始处开始读取然后正确结束,但在接收到这一段二进制数据时发生了多读或少读数据。估计是其他原因 我再研究下。


   

论坛徽章:
0
发表于 2013-07-30 09:57 |显示全部楼层
加一行
binary
试试

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
发表于 2013-07-30 12:10 |显示全部楼层
不太熟悉http协议。记得http包是以 \0 作为结束标志的。所以内部不允许出现非ascii码、二进制信息要先base64才能传送。这样直接插入二进制内容,真的可以吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP