![字体变小](http://blog.hexun.com/img/xiao.gif)
![字体变大](http://blog.hexun.com/img/da.gif)
1、什么是ACE(略)
2、什么是Proactor(略)
3、例子:/ACE_wrappers/examples/Reactor/Proactor/test_proactor
3.1、运行环境
172.16.34.11:winxp
172.16.33.34:linux(版本略)
172.16.33.23:solaris(版本略)
3.2、34.11作为服务器端,33.34作为客户端:
服务器端先启动:
D:/share/ace_server_code/ACE_wrappers5.4/examples/Reactor/Proactor>test_proactor -d c:/test.txt
客户端启动发送文件:
[jcwang@portal Proactor]$ ./test_proactor -h 172.16.34.11 -f README
(25795 | 1024) ACE_POSIX_AIOCB_Proactor::Max Number of AIOs=1024
handle_read_file called
********************
bytes_to_read = 8192
handle = 3
bytes_transfered = 2946
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 2946
handle = 4
bytes_transfered = 2946
act = 0
success = 1
completion_key = 0
error = 0
服务器端收到文件数据:
./test_proactor.cpp:122:Receiver::open called
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 44
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 44
handle = 1776
bytes_transfered = 44
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 512
handle = 1776
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 512
handle = 1776
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 512
handle = 1776
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 512
handle = 1776
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 512
handle = 1776
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 512
handle = 1796
bytes_transfered = 386
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_file called
********************
bytes_to_write = 386
handle = 1776
bytes_transfered = 386
act = 0
success = 1
completion_key = 0
error = 0
服务器成功收到文件:)
3.3、33.23作为服务器端,34.11作为客户端:
服务器端先启动:
$ ./test_proactor
(5907 | 1) ACE_POSIX_AIOCB_Proactor::Max Number of AIOs=1024
客户端启动发送:
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 512
handle = 1924
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_transmit_file called
********************
socket = 1924
file = 1804
bytes_to_write = 0
bytes_per_send = 0
flags = 0
bytes_transfered = 3032
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 512
handle = 1924
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 512
handle = 1924
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 512
handle = 1924
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 512
handle = 1924
bytes_transfered = 512
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_file called
********************
bytes_to_read = 512
handle = 1952
bytes_transfered = 384
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_write_stream called
********************
bytes_to_write = 384
handle = 1924
bytes_transfered = 384
act = 0
success = 1
completion_key = 0
error = 0
服务器端:
../../../../examples/Reactor/Proactor/test_proactor.cpp:85:Receiver::open called
客户端再次调用发送。服务器端:
handle_read_stream called
********************
bytes_to_read = 1024
handle = 6
bytes_transfered = 1024
act = 0
success = 1
completion_key = 0
error = 0
********************
handle_read_stream called
********************
bytes_to_read = 1024
handle = 6
bytes_transfered = 1024
act = 0
success = 1
completion_key = 0
error = 0
********************
../../../../examples/Reactor/Proactor/test_proactor.cpp:85:Receiver::open called
几次之后:
服务器端:
********************
../../../../examples/Reactor/Proactor/test_proactor.cpp:85:Receiver::open called
ACE_POSIX_AIOCB_Proactor::delete_result_aiocb_list
number pending AIO=0
$ ls -all
total 1898
drwxrwxrwx 4 gchen wap 1024 Feb 12 15:04 .
drwxrwxrwx 9 gchen wap 512 Jan 12 11:23 ..
drwxrwxrwx 2 gchen wap 512 Jan 12 15:17 .deps
drwxrwxrwx 2 gchen wap 512 Jan 12 15:17 .libs
-rw-rw-rw- 1 gchen wap 36761 Jan 12 11:23 Makefile
-rw-r--r-- 1 jcwang wap 0 Feb 12 16:39 output
Output为0,文件没写入:(
3.4、33.34作为服务器端(略,因为不支持)
4、结论(仅根据现象)
Windows对proactor支持得不错,起码走完了流程,成功接收从linux发来的文件,并新建文件写入数据;solaris从屏显上看也异步接收了数据,创建了文件,但没写入(不知原因),最令人费解的是客户端发送几次后ACE_POSIX_AIOCB_Proactor::delete_result_aiocb_list
number pending AIO=0,由此终止,再连:ACE_SOCK_Connector::connect: 由于目标机器积极拒绝,无法连接;linux不支持,作为服务器无反应。
5、应用背景
之前有个用proactor框架做的并发服务器已在windows上作为服务运行得不错,现想移植到linux或solaris上,框架不变,仍用proactor。但从基本例程的运行来看,似乎还需进一步分析可行性,也期冀技术上被支持,资源难寻呀!找了个ace的qq群,几十人尚无人帮助我,期待!
注:
pend
[pend]
vi.
悬而未决