在Windows中使用Boost asio重新连接套接字

时间:2011-03-04 11:36:25

标签: c++ windows boost boost-asio

将套接字连接到另一个端点后,我遇到了麻烦。

情况就是这样:

a) boost::asio::ip::tcp::socket已连接到远程主机(例如 pop.remote1.com )。

b)传输结束,套接字关闭:

 socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, error);
 socket_.close(error);

然后,当尝试使用 a)中的相同进程连接到其他主机(例如 pop.remote2.com )时,proccess会返回而不会出错,但是插座保持关闭状态。

请注意,当使用 pop.remote2.com 作为第一个连接时,运行正常,如果尝试连接到 pop.remote1.com 关闭后。

在这两种情况下,附加的io_service中都没有待处理的进程。

问题是:

  

重新连接是否可以接受?

     

这是假设正确的过程吗?

提前致谢。

Pd积: 我试图在重新连接之前打开套接字,但结果保持不变。也就是说,如果在使用。

关闭之前的连接后,结果是相同的
 socket_.shutdown(...);
 socket_.close(...);

用于

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

或只是

 socket_.async_connect( ... );

最后的想法:

在花了一些时间解决问题,并使用MS Visual Studio进行一些调试后,我认为这是不可能的,至少在Asio v.1.45.0中是这样; Windows 32和VC ++。

也许问题是这里-at Boost图书馆 - 所有人都在思考和使用对象,如果有时需要重新连接,只需删除适当的对象,并建立新的连接......创建一个新对象!

这是我在我的应用程序中所做的解决方案,取得了良好的效果,并且需要一些额外的代码。

HTH对其他人。

1 个答案:

答案 0 :(得分:0)

  

重新连接是否可以接受?

  

这是假设正确的过程吗?

是的,没有。如果您在为前一个连接close之后没有为后续连接打开套接字,则需要执行此操作。例如:

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