【问题标题】:Reconnect a socket with Boost asio in Windows在 Windows 中使用 Boost asio 重新连接套接字
【发布时间】:2011-03-04 11:36:25
【问题描述】:

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

情况是这样的:

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

b)传输结束,socket关闭:

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

然后,当尝试使用与 a) 中相同的进程连接到另一台主机(例如 pop.remote2.com)时,该进程返回且没有错误,但套接字保持关闭。

注意,当使用 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++。

也许问题在于,在 Boost 库中,所有人都在思考和使用对象,如果有时需要重新连接,只需删除适当的对象,然后进行新的连接……创建一个新对象!

这是我在我的应用程序中使用的解决方案,效果很好,我想了一些额外的代码。

HTH 给其他人。

【问题讨论】:

  • 如何重新连接套接字?
  • @Stefan 感谢您的关注。正如我告诉 Sam Miller 的那样,要重新连接,我使用了一个普通的 'async_connect()' 没有成功 - 第一个连接的设备 -。

标签: c++ windows boost boost-asio


【解决方案1】:

是否允许重新连接?

是的

这是假定的正确过程吗?

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

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

【讨论】:

  • 非常感谢您的回答。要重新连接,我使用了一些 lilke:socket_.async_connect (endpoint, boost::bind(&hndlConnect, this, boost::asio::placeholders::error, ++endpoint_iterator)); 每次第一次都有效,顺便说一句,文档说:“如果套接字尚未打开,则会自动打开它”。无论如何,我会在重新连接之前尝试你的 open 建议,看看会发生什么。
  • @Old 你是对的,如果套接字尚未打开,async_connect 将隐式打开它。我不清楚你有什么问题。你能更新你的问题来澄清它吗?例如,您在连接处理程序中得到什么错误代码?
猜你喜欢
  • 2023-03-11
  • 2012-01-16
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多