回复 #10 modern 的帖子
你说的是ace里example里那个传文件的例子吗?看的很晕。我那样传真的没救了吗?:Q :Q :Q :Q可不可以分批次发送之类的。
[ 本帖最后由 psycheqiqi 于 2009-10-21 13:55 编辑 ] 传文件的办法很多,一直提这个例子是因为,刚好是ACE自身提供的,
大家都能很容易看到,而且原理比较简单。
看楼用的用法,明显是对理解Proactor的运行机制理解的不够深刻。
例子看不懂,没关系,先看书,搞懂理论与基础知识。
所谓欲速则不达,学习ACE如果基础不扎实,不是一步到位的事情。 另外,其实楼主这么短时间,能理解到这个地步已经相当不错了,
再加把劲,其实技术往往就是一层窗户纸,捅破了之后就好了。
回复 #13 modern 的帖子
我刚才已经在看C++ np2了。谢谢modern:D回复 #12 modern 的帖子
传文件的方法还有哪些?能满足多连接、不会造成缓冲区溢出的。
回复 #13 modern 的帖子
test_proactor运行时的参数怎么设置服务器、客户端的参数怎么写 modern,你终于来了 在test_proactor里不也需要先把文件写到缓冲区中去然后再发吗?
为什么在多连接的时候就不会造成缓冲区溢出?
操作系统会在什么时候把缓冲区的内容发送出去?
我现在始终不明白为什么我的那样逻辑实现会缓冲区溢出。:'( 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的值应该容易找到原因。 我猜测,问题可能是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。