免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

看看这个函数,并说明为什么要这样read(fd). [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-03-23 22:53 |只看该作者
不能假定一次性读得完.这是基本常识.

论坛徽章:
0
22 [报告]
发表于 2010-03-23 23:11 |只看该作者
如果事先不知道要读的内容的大小,那我认为是最初设计的不好。
1. 假设fd代表的是一个流,例如pipe,socke ...
思一克 发表于 2010-03-23 22:49



    不能一次读出也不该使用这样的方法,比如读头4字节

int total_len = 4;
int res;
while ( total_len > 0 ) {
    res = read (fd, buffer, total_len);
    if ( res <= 0 )
         /* err handle */
    if ( res < total_len ) {
         total_len -= res;
         buffer += res;
    } else
         break;
}

总之无论如何,都不应该是字节读。对于不知道长度,前面说了,指数递增每次读的长度。

论坛徽章:
0
23 [报告]
发表于 2010-03-23 23:17 |只看该作者
ls  , 把
    if ( res < total_len ) {
         total_len -= res;
         buffer += res;
    } else
         break;

改成:
         total_len -= res;
         buffer += res;
即可!

论坛徽章:
0
24 [报告]
发表于 2010-03-23 23:18 |只看该作者
补充一下哈,对于不知道长度。
指数递增是非常乐观的办法。
其他的办法还有:
1.两个指数之间取随机数
2.斐波那契数列递增

论坛徽章:
0
25 [报告]
发表于 2010-03-23 23:20 |只看该作者
总之无论如何,都不应该是字节读。对于不知道长度,前面说了,指数递增每次读的长度。

//////////////////////////////////////////////////////////

1楼的代码的跟你的有区别?

人家的代码写的不是很好,但是设计是没有问题的。
你的buffer += res
跟他的
&buffer[res]有区别?

论坛徽章:
0
26 [报告]
发表于 2010-03-23 23:25 |只看该作者
补充一下哈,对于不知道长度。
指数递增是非常乐观的办法。
其他的办法还有:
1.两个指数之间取随机数
...
专操五毛 发表于 2010-03-23 23:18



你是不是看多了vector的实现啊?

指数递增?
这个是从网络读取数据吧,你指针递增多少取决于你收到了多少字节呢,你第一次收到了1个,你指针便宜1个字节
第二次收到一个字节你便宜2个字节
第三次 收到一个       。。。。。。 4个字节

第四次收到100个,你便宜  8个字节?

不好吧

论坛徽章:
0
27 [报告]
发表于 2010-03-23 23:30 |只看该作者
人家的代码写的不是很好,但是设计是没有问题的。

总之无论如何,都不应该是字节读。对于不知道长度,前面说了,指数递增每次读的长度。

//////////////// ...
ztz0223 发表于 2010-03-23 23:20


这样设计没有超时机制. 很轻易让人钻漏洞.

属于"玩具级"的设计.

论坛徽章:
0
28 [报告]
发表于 2010-03-23 23:35 |只看该作者
回复 26# ztz0223


    不是啊,我是只buffer增长的策略,不是单指socket,所以才叫补充啊。

论坛徽章:
0
29 [报告]
发表于 2010-03-23 23:40 |只看该作者
总之无论如何,都不应该是字节读。对于不知道长度,前面说了,指数递增每次读的长度。

//////////////// ...
ztz0223 发表于 2010-03-23 23:20



  当然有区别,它是一个字节一个字节读,而我是尽力读。
读操作未完成,除了已经读完之外,就是被信号打断了,而这种情况的几率是很小的。
千万不要因为代码来自某个开源项目就不敢质疑它。水平低的开源项目代码多不胜数,即使是著名的开源项目中,也常可以看到低能代码,前提是这个著名的项目由某个较为封闭的社区开发的

论坛徽章:
0
30 [报告]
发表于 2010-03-23 23:45 |只看该作者
你是不是看多了vector的实现啊?

指数递增?
这个是从网络读取数据吧,你指针递增多少取决于你收 ...
ztz0223 发表于 2010-03-23 23:25



    前面已经说了,基于流的fd,例如socket、fd,需要设计一个header指明后续有多少字节需要读。
   我无法想象基于何种理由,client无从知道一次通讯中server发多少字节。即使一个字节一个字节的读,client也无法知道何时应该结束读,如果设计一个字节表示结束字符,那为什么又不在开始阶段就用header指出一次通讯的数据量呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP