2012-05-21 4 views
0

Я написал прокси-сервисную программу, которая использовала boost asio, прокси-сервер имеет два сокета (client_socket_, server_socket _). Если один из сокетов отключен, другой останется активным. Например , если чтение из client_socket_ приводит к ошибке, я закрою client_socket_, а затем подождите, пока клиент не заново подключится, и после того, как клиент снова подключится, я прочитаю из одного сокета и напишу другому.boost asio, как отменить асинхронную операцию

Проблема в том, что, когда я закрываю client_socket_, как отменить асинхронную операцию в server_socket_? если я этого не сделаю, предыдущая асинхронная операция будет выполняться после подключения клиента. Следующее - отслеживание обработчика, обработчик 19 необходимо отменить.

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| 

ответ

4

Единственный переносимый и надежный способ отмены async.operations на сервере server_socket_ заключается в его закрытии. Подробности см. На странице following link.

+0

Но я не намерен закрывать server_socket_, если я определяю BOOST_ASIO_ENABLE_CANCELIO и вызываю server_socket_.cancel(), чтобы отменить предыдущую асинхронную операцию, но не закрыть server_socket_, можно вызвать asio :: async_read (server_socket_, ...), когда клиент воссоединяется? – Jayden

+0

@Jayden, вы можете использовать cancel(), если вы в порядке с тем, что «он может казаться завершенным без ошибок, но запрос на отмену незавершенных операций может быть беспроигрышно проигнорирован операционной системой. похоже, зависит от установленных драйверов ». Кроме того, даже если это удается, некоторые данные могут быть прочитаны с сервера - так что вам нужно изобрести какой-то способ пересинхронизации с вашим сервером. –

+0

Igor R, благодарю вас за терпение, чтобы ответить на мой вопрос, что означает это решение для «Отключить брандмауэр завершения ввода-вывода asio, определяя BOOST_ASIO_DISABLE_IOCP.»? [в этом документе] (http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/reference/basic_stream_socket/cancel/overload2.html) Я был новичком boost :: asio. – Jayden

Смежные вопросы