免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2010-03-23 22:22 |显示全部楼层
JOHNBULL说的MEMSET不需要是对的。
JOHNBULL是技术大牛。一般不会看错的。

这段代码其实是很巧妙 ...
思一克 发表于 2010-03-23 22:11



    我实在没从这代码里看出任何巧妙之处。
  如果没有很特殊的条件,我个人认为这段代码非常笨拙。

论坛徽章:
0
2 [报告]
发表于 2010-03-23 22:46 |显示全部楼层
就是一个循环内不用拷贝得到一个整体数据块。

不巧妙的方式有2个,一个是一个个字节读,另一个是读 ...
思一克 发表于 2010-03-23 22:26



    如果事先不知道要读的内容的大小,那我认为是最初设计的不好。
1. 假设fd代表的是一个流,例如pipe,socket之类。应该在数据前面设计一个header,最简单就是前4个字节代表长度,然后后面一次读出。
2. 假设fd代表一个文件,那知道文件大小的方法很多的。
3. 即使是真不知道大小(无论如何也该有个预期大小,应该是知道的,否则连buffer的大小都无法设置),也该用尽力读的方式。比如一次对1K字节,然后判断read的返回值以决定是否已经读尽。如果连预期大小都不知道,即连到底是几十字节还是几十兆的数据都不知道,那也应该使用指数增长的方式读。例如第一次读1字节,成功。第二次读2字节;第三次4字节;第4次16字节 …… 以此类推。否则对于巨大的不知道大小的文件,这样字节读带来的开销不可想象。

论坛徽章:
0
3 [报告]
发表于 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
4 [报告]
发表于 2010-03-23 23:40 |显示全部楼层
总之无论如何,都不应该是字节读。对于不知道长度,前面说了,指数递增每次读的长度。

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



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

论坛徽章:
0
5 [报告]
发表于 2010-03-23 23:45 |显示全部楼层
你是不是看多了vector的实现啊?

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



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

论坛徽章:
0
6 [报告]
发表于 2010-03-24 23:57 |显示全部楼层
char buf;

int read_in(int fd)

{

int i, j;



memset(buf,0,SIZE);

  for(i = 0; i < SI ...
benjiam 发表于 2010-03-24 09:20



    是我穿越了

论坛徽章:
0
7 [报告]
发表于 2010-03-25 00:05 |显示全部楼层
本帖最后由 zx_wing 于 2010-03-25 00:07 编辑
前面已经说了,基于流的fd,例如socket、fd,需要设计一个header指明后续有多少字节需要读。
   我无法想象 ...
思一克 发表于 2010-03-24 20:54



    这些协议我都不懂。我想知道它们是如何设计收发的?
   如果事先无法预估要接收内容的大小,那C语言里如何分配接收的Buffer?
   对于不知道一次传输多少数据量的协议,将数据分成一个个固定大小的报文,通过首/末报文,接收方可以判断一次接收结束。这不奇怪。
   当然如果设定了一个特殊的结束标志,那么接收方可一次读若干字节,判断是否结束。那这其实还是事先知道接收数据的大概大小,以此决定一次读入的长度。
   我无法理解的是,对于基于流的传输,又没有数据格式(这里特指要接收的长度,也没有预估大小), 接收方如何能判断该收多少?什么时候结束?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP