找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: psycheqiqi

proactor传文件的测试

[复制链接]
 楼主| 发表于 2009-10-21 13:07:13 | 显示全部楼层

回复 #10 modern 的帖子

你说的是ace里example里那个传文件的例子吗?看的很晕。


我那样传真的没救了吗?:Q :Q :Q :Q可不可以分批次发送之类的。

[ 本帖最后由 psycheqiqi 于 2009-10-21 13:55 编辑 ]
发表于 2009-10-21 13:58:40 | 显示全部楼层
传文件的办法很多,一直提这个例子是因为,刚好是ACE自身提供的,
大家都能很容易看到,而且原理比较简单。

看楼用的用法,明显是对理解Proactor的运行机制理解的不够深刻。
例子看不懂,没关系,先看书,搞懂理论与基础知识。
所谓欲速则不达,学习ACE如果基础不扎实,不是一步到位的事情。
发表于 2009-10-21 14:02:20 | 显示全部楼层
另外,其实楼主这么短时间,能理解到这个地步已经相当不错了,
再加把劲,其实技术往往就是一层窗户纸,捅破了之后就好了。
 楼主| 发表于 2009-10-21 14:12:33 | 显示全部楼层

回复 #13 modern 的帖子

我刚才已经在看C++ np2了。谢谢modern:D
 楼主| 发表于 2009-10-22 09:45:24 | 显示全部楼层

回复 #12 modern 的帖子

传文件的方法还有哪些?
能满足多连接、不会造成缓冲区溢出的。
 楼主| 发表于 2009-10-22 10:50:31 | 显示全部楼层

回复 #13 modern 的帖子

test_proactor运行时的参数怎么设置
服务器、客户端的参数怎么写
 楼主| 发表于 2009-10-22 11:19:45 | 显示全部楼层
modern,你终于来了
 楼主| 发表于 2009-10-22 14:48:38 | 显示全部楼层
在test_proactor里不也需要先把文件写到缓冲区中去然后再发吗?
为什么在多连接的时候就不会造成缓冲区溢出?
操作系统会在什么时候把缓冲区的内容发送出去?
我现在始终不明白为什么我的那样逻辑实现会缓冲区溢出。:'(
发表于 2009-10-22 16:00:49 | 显示全部楼层
this->writer应该是个ACE_Asynch_Write_Stream吧。它的write()是异步的,返回成功表示已经发送请求,该请求在排队中。并不表示已经写到socket buffer里了。过一段时间,系统在完成写入socket buffer后,会产生完成通知,触发执行handle_write_stream()。write出错不会是缓冲区满的原因,socket缓冲区在io繁忙的时候常常是满的,这时候io请求会排队而不是返回出错。

ACE_Asynch_Write_Stream的write()在windws上的实现代码在WIN32_Asynch_IO.cpp:
int
ACE_WIN32_Asynch_Write_Stream::write (ACE_Message_Block &message_block,
                                      size_t bytes_to_write,
                                      const void *act,
                                      int priority,
                                      int signal_number);
其调用的shared_write()用了WSASend()的OVERLAPPED模式。

楼主说传大文件会出问题,write()返回出错。这个write()中的返回点不多,参考一下errno的值应该容易找到原因。
发表于 2009-10-22 16:13:40 | 显示全部楼层
我猜测,问题可能是new的内存(message block)太快太多了。这些内存需要在写入socket buffer后才会被handle_write_stream() release掉(楼主应该在handle_write_stream()中执行了release()了吧?)。
总之,申请内存(在WriteDate()中new message block)的速度是读磁盘文件的速度,释放内存(在handle_write_stream()中release message block)的速度是网络的传输速度,显然这两个速度不会匹配,时间长了内存就不够用了。ace自带example里的test_proactor.cpp好像也有这个问题。

这属于典型的流量控制问题,可以通过限制发送方速度来解决。比如做一个message block的pool,当满了的时候不再读入新的mb。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 17:54 , Processed in 0.015727 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表