Reputation: 3
I wrote a proxy service program that used boost asio, the proxy server has two socket(client_socket_,server_socket_),If one of the socket is disconnected another one to remain active。For example, if read from client_socket_ results in error, i will close client_socket_ and then wait for client to reconnect and after client reconnects, I read from one socket and write to another.
The problem is that, when i close the client_socket_ how to cancel the asynchronous operation in server_socket_? if i do not do this, the previous asynchronous operation will execute after client connected. The follow is handler tracking, handler 19 is need to cancel.
E:\code\vdoctor-r\code\dnc\Debug>forwardserver.exe
@asio|1337591080.941830|0*1|[email protected]_accept
@asio|1337591107.009440|>1|ec=system:0
@asio|1337591107.009440|1*2|[email protected]
@asio|1337591107.009440|>2|
@asio|1337591107.009440|2*3|[email protected]_connect
@asio|1337591107.025059|2*4|[email protected]_accept
@asio|1337591107.025059|<2|
@asio|1337591107.025059|<1|
@asio|1337591107.025059|>3|ec=system:0
@asio|1337591107.025059|3*5|[email protected]
@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|[email protected]_receive
@asio|1337591107.040678|5*7|[email protected]_receive
@asio|1337591107.040678|<5|
@asio|1337591107.040678|<3|
@asio|1337591107.040678|>6|ec=system:0,bytes_transferred=20
@asio|1337591107.040678|6*8|[email protected]
@asio|1337591107.040678|>8|
@asio|1337591107.040678|8*9|[email protected]_receive
@asio|1337591107.040678|<8|
@asio|1337591107.040678|<6|
@asio|1337591107.040678|>9|ec=system:0,bytes_transferred=17
@asio|1337591107.040678|9*10|[email protected]
@asio|1337591107.040678|>10|
@asio|1337591107.040678|10*11|[email protected]_send
@asio|1337591107.056296|<10|
@asio|1337591107.056296|<9|
@asio|1337591107.056296|>11|ec=system:0,bytes_transferred=37
@asio|1337591107.056296|11*12|[email protected]
@asio|1337591107.056296|>12|
@asio|1337591107.056296|12*13|[email protected]_receive
@asio|1337591107.056296|<12|
@asio|1337591107.056296|<11|
@asio|1337591107.071915|>7|ec=system:0,bytes_transferred=20
@asio|1337591107.071915|7*14|[email protected]
@asio|1337591107.071915|>14|
@asio|1337591107.071915|14*15|[email protected]_receive
@asio|1337591107.071915|<14|
@asio|1337591107.071915|<7|
@asio|1337591107.071915|>15|ec=system:0,bytes_transferred=18
@asio|1337591107.071915|15*16|[email protected]
@asio|1337591107.071915|>16|
@asio|1337591107.071915|16*17|[email protected]_send
@asio|1337591107.071915|<16|
@asio|1337591107.071915|<15|
@asio|1337591107.087534|>17|ec=system:0,bytes_transferred=38
@asio|1337591107.087534|17*18|[email protected]
@asio|1337591107.087534|>18|
@asio|1337591107.087534|18*19|[email protected]_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|[email protected]
@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|[email protected]
@asio|1337591107.884087|<20|
@asio|1337591107.884087|<13|
@asio|1337591222.813720|>4|ec=system:0
@asio|1337591222.813720|4*21|[email protected]
@asio|1337591222.813720|>21|
@asio|1337591222.813720|21*22|[email protected]_receive
@asio|1337591222.813720|21*23|[email protected]_receive
@asio|1337591222.813720|21*24|[email protected]_accept
@asio|1337591222.813720|<21|
@asio|1337591222.813720|<4|
@asio|1337591222.813720|>22|ec=system:0,bytes_transferred=20
@asio|1337591222.813720|22*25|[email protected]
@asio|1337591222.813720|>25|
@asio|1337591222.813720|25*26|[email protected]_receive
@asio|1337591222.813720|<25|
@asio|1337591222.813720|<22|
@asio|1337591222.813720|>26|ec=system:0,bytes_transferred=17
@asio|1337591222.813720|26*27|[email protected]
@asio|1337591222.813720|>27|
@asio|1337591222.813720|27*28|[email protected]_send
@asio|1337591222.813720|<27|
@asio|1337591222.813720|<26|
@asio|1337591222.813720|>28|ec=system:0,bytes_transferred=37
@asio|1337591222.813720|28*29|[email protected]
@asio|1337591222.813720|>29|
@asio|1337591222.813720|29*30|[email protected]_receive
@asio|1337591222.813720|<29|
@asio|1337591222.813720|<28|
@asio|1337591222.813720|>19|ec=system:0,bytes_transferred=20
@asio|1337591222.813720|19*31|[email protected]
@asio|1337591222.813720|>31|
@asio|1337591222.813720|31*32|[email protected]_receive
@asio|1337591222.813720|<31|
@asio|1337591222.813720|<19|
@asio|1337591222.813720|>23|ec=system:0,bytes_transferred=18
@asio|1337591222.813720|23*33|[email protected]
@asio|1337591222.829340|>33|
@asio|1337591222.829340|33*34|[email protected]_receive
@asio|1337591222.829340|<33|
@asio|1337591222.829340|<23|
Upvotes: 0
Views: 15497
Reputation: 15075
The only portable and reliable way to cancel async.operations on server_socket_ is to close it. See the following link for details.
Upvotes: 5