【发布时间】:2011-03-05 00:25:03
【问题描述】:
我的客户端应用程序使用boost::asio::ip::tcp::socket 连接到远程服务器。
如果应用程序失去与该服务器的连接(例如,由于服务器崩溃或关闭),我希望它定期尝试重新连接,直到成功。
我需要在客户端做什么才能彻底处理断开连接、整理并反复尝试重新连接?
目前我的代码中有趣的部分看起来像这样。
我connect 喜欢这样:
bool MyClient::myconnect()
{
bool isConnected = false;
// Attempt connection
socket.connect(server_endpoint, errorcode);
if (errorcode)
{
cerr << "Connection failed: " << errorcode.message() << endl;
mydisconnect();
}
else
{
isConnected = true;
// Connected so setup async read for an incoming message.
startReadMessage();
// And start the io_service_thread
io_service_thread = new boost::thread(
boost::bind(&MyClient::runIOService, this, boost::ref(io_service)));
}
return (isConnected)
}
runIOServer() 方法只是:
void MyClient::runIOService(boost::asio::io_service& io_service)
{
size_t executedCount = io_service.run();
cout << "io_service: " << executedCount << " handlers executed." << endl;
io_service.reset();
}
如果任何异步读取处理程序返回错误,那么他们只需调用此disconnect 方法:
void MyClient::mydisconnect(void)
{
boost::system::error_code errorcode;
if (socket.is_open())
{
// Boost documentation recommends calling shutdown first
// for "graceful" closing of socket.
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorcode);
if (errorcode)
{
cerr << "socket.shutdown error: " << errorcode.message() << endl;
}
socket.close(errorcode);
if (errorcode)
{
cerr << "socket.close error: " << errorcode.message() << endl;
}
// Notify the observer we have disconnected
myObserver->disconnected();
}
..它尝试优雅地断开连接,然后通知观察者,观察者将开始每隔五秒调用connect(),直到重新连接。
我还有什么需要做的吗?
目前这确实 似乎 工作。如果我杀死它所连接的服务器,我会在我的读取处理程序中得到预期的"End of file" 错误,并且mydisconnect() 被调用而没有任何问题。
但是当它尝试重新连接并失败时,我看到它报告"socket.shutdown error: Invalid argument"。这仅仅是因为我试图关闭一个没有读/写挂起的套接字吗?还是更多?
【问题讨论】:
-
如果您已经检测到连接的另一端正在关闭,您调用关机的理由是什么?
-
@samm:不推荐吗?我认为套接字上可能有待处理的操作需要用
shutdown()取消。我主要是为了简单起见:如果我想正常断开连接,或者任何异步操作返回错误,则调用相同的mydisconnect()方法。 -
我不确定是否推荐。待处理的数据或操作会去哪里?连接的另一端不存在。
-
@SamMiller 没必要。在一篇被广泛误解的 MSDN 文章中推荐了它,其目的是向您展示如何实现两个对等方的同步关闭,但在这种情况下,您应该只关闭输出。
close()就是所需要的。仍在传输中的数据仍在传输中。
标签: c++ sockets boost boost-asio