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

连接到另一个端点后,将套接字连接到端点时遇到问题。

这是情况:

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

b)传输结束,socketsclosures:

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

然后,在尝试使用a )中的相同进程连接到另一个主机(例如pop.remote2.com )时,该进程无错地返回,但是该套接字保持closures状态。

请注意,在使用pop.remote2.com作为第一个连接时,事情运行正常,并且在closures后尝试连接到pop.remote1.com也会出现同样的问题。

在这两种情况下,附件io_service都没有挂起的进程。

问题是:

这种重新连接是否可以接受?

那是假设正确的过程?

提前致谢。

PD:我尝试在重新连接之前打开套接字,但结果保持不变。 也就是说,如果closures之前的连接,结果是一样的。

  socket_.shutdown(...); socket_.close(...); 

用来

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

要不就

  socket_.async_connect( ... ); 

最后的想法是:

在花了一些时间在这个问题上,并且使用MS Visual Studio做了一些debugging之后,我认为这是不可能的,至less在Asio v。1.45.0中是这样的; Windows 32和VC ++。

也许问题是,在这里 – 所有人都在思考和使用对象,如果有时需要重新连接,只需删除适当的对象,并build立一个新的连接…创build一个新的对象!

这是我在我的应用程序中所做的解决scheme,取得了良好的效果,还有一些额外的代码。

HTH给其他人。

这种重新连接是否可以接受?

那是假设正确的过程?

是和不是。 如果在close前一个连接后没有打开后续连接的套接字,则需要这样做。 例如:

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