【问题标题】:boost asio,how to cancel an asynchronous operationboost asio,如何取消异步操作
【发布时间】:2012-05-21 10:09:42
【问题描述】:

我写了一个使用boost asio的代理服务程序,代理服务器有两个socket(client_socket_,server_socket_),如果其中一个socket断开另一个保持活动状态。例如如果从client_socket_读取导致错误,我将关闭 client_socket_ 然后等待客户端重新连接,客户端重新连接后,我从一个套接字读取并写入另一个。

问题是,当我关闭client_socket_时如何取消异步操作 在 server_socket_ 中?如果我不这样做,之前的异步操作将在客户端连接后执行。下面是handler跟踪,handler 19需要取消。

E:\code\vdoctor-r\code\dnc\Debug>forwardserver.exe
@asio|1337591080.941830|0*1|socket@0012FA58.async_accept
@asio|1337591107.009440|>1|ec=system:0
@asio|1337591107.009440|1*2|strand@003E8340.dispatch
@asio|1337591107.009440|>2|
@asio|1337591107.009440|2*3|socket@0012FAB0.async_connect
@asio|1337591107.025059|2*4|socket@0012FA58.async_accept
@asio|1337591107.025059|<2|
@asio|1337591107.025059|<1|
@asio|1337591107.025059|>3|ec=system:0
@asio|1337591107.025059|3*5|strand@003E8340.dispatch
@asio|1337591107.025059|>5|
2012-May-21 17:05:07 [info]-[e:\code\vdoctor-r\code\dnc\forwardserver\forward_se
rver.cpp(114):forward_server::handle_connect_to_server] connect to server succes
sful, start to receive data from both sides
@asio|1337591107.040678|5*6|socket@003E83D4.async_receive
@asio|1337591107.040678|5*7|socket@0012FAB0.async_receive
@asio|1337591107.040678|<5|
@asio|1337591107.040678|<3|
@asio|1337591107.040678|>6|ec=system:0,bytes_transferred=20
@asio|1337591107.040678|6*8|strand@003E8340.dispatch
@asio|1337591107.040678|>8|
@asio|1337591107.040678|8*9|socket@003E83D4.async_receive
@asio|1337591107.040678|<8|
@asio|1337591107.040678|<6|
@asio|1337591107.040678|>9|ec=system:0,bytes_transferred=17
@asio|1337591107.040678|9*10|strand@003E8340.dispatch
@asio|1337591107.040678|>10|
@asio|1337591107.040678|10*11|socket@0012FAB0.async_send
@asio|1337591107.056296|<10|
@asio|1337591107.056296|<9|
@asio|1337591107.056296|>11|ec=system:0,bytes_transferred=37
@asio|1337591107.056296|11*12|strand@003E8340.dispatch
@asio|1337591107.056296|>12|
@asio|1337591107.056296|12*13|socket@003E83D4.async_receive
@asio|1337591107.056296|<12|
@asio|1337591107.056296|<11|
@asio|1337591107.071915|>7|ec=system:0,bytes_transferred=20
@asio|1337591107.071915|7*14|strand@003E8340.dispatch
@asio|1337591107.071915|>14|
@asio|1337591107.071915|14*15|socket@0012FAB0.async_receive
@asio|1337591107.071915|<14|
@asio|1337591107.071915|<7|
@asio|1337591107.071915|>15|ec=system:0,bytes_transferred=18
@asio|1337591107.071915|15*16|strand@003E8340.dispatch
@asio|1337591107.071915|>16|
@asio|1337591107.071915|16*17|socket@003E83D4.async_send
@asio|1337591107.071915|<16|
@asio|1337591107.071915|<15|
@asio|1337591107.087534|>17|ec=system:0,bytes_transferred=38
@asio|1337591107.087534|17*18|strand@003E8340.dispatch
@asio|1337591107.087534|>18|
@asio|1337591107.087534|18*19|socket@0012FAB0.async_receive
@asio|1337591107.087534|<18|
@asio|1337591107.087534|<17|
@asio|1337591107.884087|>13|ec=asio.misc:2,bytes_transferred=0
@asio|1337591107.884087|13*20|strand@003E8340.dispatch
@asio|1337591107.884087|>20|
2012-May-21 17:05:07 [error]-[e:\code\vdoctor-r\code\dnc\forwardserver\forward_s
erver.cpp(273):forward_server::handle_read_header_from_client] read header from
client error,End of file
@asio|1337591107.884087|20|socket@003E83D4.close
@asio|1337591107.884087|<20|
@asio|1337591107.884087|<13|
@asio|1337591222.813720|>4|ec=system:0
@asio|1337591222.813720|4*21|strand@003E8340.dispatch
@asio|1337591222.813720|>21|
@asio|1337591222.813720|21*22|socket@003ECF2C.async_receive
@asio|1337591222.813720|21*23|socket@0012FAB0.async_receive
@asio|1337591222.813720|21*24|socket@0012FA58.async_accept
@asio|1337591222.813720|<21|
@asio|1337591222.813720|<4|
@asio|1337591222.813720|>22|ec=system:0,bytes_transferred=20
@asio|1337591222.813720|22*25|strand@003E8340.dispatch
@asio|1337591222.813720|>25|
@asio|1337591222.813720|25*26|socket@003ECF2C.async_receive
@asio|1337591222.813720|<25|
@asio|1337591222.813720|<22|
@asio|1337591222.813720|>26|ec=system:0,bytes_transferred=17
@asio|1337591222.813720|26*27|strand@003E8340.dispatch
@asio|1337591222.813720|>27|
@asio|1337591222.813720|27*28|socket@0012FAB0.async_send
@asio|1337591222.813720|<27|
@asio|1337591222.813720|<26|
@asio|1337591222.813720|>28|ec=system:0,bytes_transferred=37
@asio|1337591222.813720|28*29|strand@003E8340.dispatch
@asio|1337591222.813720|>29|
@asio|1337591222.813720|29*30|socket@003ECF2C.async_receive
@asio|1337591222.813720|<29|
@asio|1337591222.813720|<28|
@asio|1337591222.813720|>19|ec=system:0,bytes_transferred=20
@asio|1337591222.813720|19*31|strand@003E8340.dispatch
@asio|1337591222.813720|>31|
@asio|1337591222.813720|31*32|socket@0012FAB0.async_receive
@asio|1337591222.813720|<31|
@asio|1337591222.813720|<19|
@asio|1337591222.813720|>23|ec=system:0,bytes_transferred=18
@asio|1337591222.813720|23*33|strand@003E8340.dispatch
@asio|1337591222.829340|>33|
@asio|1337591222.829340|33*34|socket@0012FAB0.async_receive
@asio|1337591222.829340|<33|
@asio|1337591222.829340|<23|

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    在 server_socket_ 上取消 async.operations 的唯一可移植且可靠的方法是关闭它。详情请见following link

    【讨论】:

    • 但是我的意图不是关闭server_socket_,如果我定义BOOST_ASIO_ENABLE_CANCELIO并调用server_socket_.cancel()取消之前的异步操作但不关闭server_socket_,可以调用asio::async_read(server_socket_, .. .) 客户端何时重新连接?
    • @Jayden,您可以使用 cancel() 如果您认为“它可以看起来完成且没有错误,但取消未完成操作的请求可能会被操作忽略系统。它是否有效似乎取决于安装的驱动程序“。此外,即使成功,也可能已经从服务器读取了一些数据——因此您需要发明一些方法来与您的服务器重新同步。
    • Igor R,感谢您耐心回答我的问题,这个解决方案“通过定义 BOOST_ASIO_DISABLE_IOCP 禁用 asio 的 I/O 完成端口后端”是什么意思? in this document我是boost::asio的新手。
    • @Jayden,如果你定义了这个宏,ASIO 将不会使用完成端口。相反,它将使用较旧的反应器模型(选择等)。您可以在此处阅读link 了解 CP 的优势。
    • @lgor R,我的意思是如果我使用“定义 BOOST_ASIO_DISABLE_IOCP”的解决方案如何取消 server_socket_ 之前的异步操作,如上面的处理程序 19。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多