У меня проблемы при подключении сокета к конечной точке после подключения к другой.
Это ситуация:
a) boost::asio::ip::tcp::socket
подключен к удаленному хосту (скажем, pop.remote1.com ).
b) Передача заканчивается, и розетка закрывается:
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, error);
socket_.close(error);
Затем при попытке подключиться к другому хосту (скажем, pop.remote2.com ), используя тот же процесс, что и в a) , процесс возвращается без ошибок, но сокет остается закрытым.
Обратите внимание, что при использовании pop.remote2.com в качестве первого соединения все работает нормально, и возникает такая же проблема, если попытаться подключиться к pop.remote1.com после закрытие.
В обеих ситуациях в прикрепленном io_service
.
нет ожидающих процессов.
Вопросы:
Это переподключение допустимо?
Это предполагаемый правильный процесс?
Заранее спасибо.
P.D:
Я пытался открыть сокет перед переподключением, но результат остался прежним. То есть результат тот же, если после закрытия предыдущего соединения с.
socket_.shutdown(...);
socket_.close(...);
используется
socket_.open(...);
socket_.async_connect( ... );
или просто
socket_.async_connect( ... );
Последняя мысль:
Потратив некоторое время на решение проблемы и отладки в MS Visual Studio, я думаю, что это просто невозможно, по крайней мере в Asio v. 1.45.0; Windows 32 и VC ++.
Возможно, вопрос в том, что здесь - в библиотеках Boost - все люди думают и используют объекты, и, если когда-нибудь понадобится восстановить соединение, просто удалите соответствующий объект и создайте новое соединение ... создав новый объект!
Это было решение, которое я использую в своем приложении с хорошими результатами, хотя и с некоторым дополнительным кодом.
HTH кому-то еще.