Переподключи сокет с Boost asio в Windows - PullRequest
2 голосов
/ 04 марта 2011

У меня проблемы при подключении сокета к конечной точке после подключения к другой.

Это ситуация:

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 кому-то еще.

1 Ответ

0 голосов
/ 04 марта 2011

Допустимо ли такое переподключение?

да

Это правильный процесс?

да и нет.Если вы не открываете сокет для последующих подключений после того, как вы close сделали это для предыдущего, вам нужно это сделать.Пример:

socket_.open();
socket_.async_connect( ... );
...