提交 aebb16ff 编写于 作者: Y yang li

Fix: if give up connecting, ascs::socket::started() still returns true.

Fix repetitive binding.
上级 eb93b242
......@@ -21,6 +21,7 @@
* 4. since 1.1.5 until 1.2, SSL doesn't support heartbeat because SSL doesn't support OOB data.
* 5. with old openssl (at least 0.9.7), ssl::client_socket_base and ssl_server_socket_base are not reusable, I'm not sure in which version,
* they became available, seems it's 1.0.0.
* 6. since 1.0.0 until 1.3.0, async_write and async_read are not mutexed on the same socket, which is a violation of asio threading model.
*
* 2016.9.25 version 1.0.0
* Based on st_asio_wrapper 1.2.0.
......@@ -453,6 +454,7 @@
* HIGHLIGHT:
*
* FIX:
* If give up connecting (prepare_reconnect returns -1 or call close_reconnect), ascs::socket::started() still returns true (should be false).
*
* ENHANCEMENTS:
* Expose server_base's acceptor via next_layer().
......
......@@ -48,12 +48,20 @@ public:
{
auto socket_ptr(this->create_object());
if (!socket_ptr)
return typename Pool::object_type();
else
{
socket_ptr->set_server_addr(port, ip);
return this->add_socket(socket_ptr, false) ? socket_ptr : typename Pool::object_type();
}
return socket_ptr;
socket_ptr->set_server_addr(port, ip);
return this->add_socket(socket_ptr, false) ? socket_ptr : typename Pool::object_type();
}
typename Pool::object_type add_socket(unsigned short port, unsigned short local_port, const std::string& ip = ASCS_SERVER_IP, const std::string& local_ip = std::string())
{
auto socket_ptr(this->create_object());
if (!socket_ptr)
return socket_ptr;
socket_ptr->set_server_addr(port, ip);
socket_ptr->set_local_addr(local_port, local_ip);
return this->add_socket(socket_ptr, false) ? socket_ptr : typename Pool::object_type();
}
///////////////////////////////////////////////////
......
......@@ -95,8 +95,8 @@ protected:
}
}
lowest_object.bind(local_addr, ec); assert(!ec);
if (ec)
lowest_object.bind(local_addr, ec);
if (ec && asio::error::invalid_argument != ec)
{
unified_out::error_out("cannot bind socket: %s", ec.message().data());
return false;
......@@ -111,7 +111,7 @@ protected:
{
if (!ec) //already started, so cannot call start()
super::do_start();
else if (need_reconnect)
else
prepare_next_reconnect(ec);
}
......@@ -144,7 +144,7 @@ protected:
private:
bool prepare_next_reconnect(const asio::error_code& ec)
{
if (this->started() && !this->stopped())
if (need_reconnect && this->started() && !this->stopped())
{
#ifdef _WIN32
if (asio::error::connection_refused != ec && asio::error::network_unreachable != ec && asio::error::timed_out != ec)
......@@ -162,6 +162,7 @@ private:
}
}
super::force_shutdown();
return false;
}
......
......@@ -185,10 +185,14 @@ protected:
//DO NOT hold msg_can for future using, just swap its content with your own container in this virtual function.
virtual void on_send_error(const asio::error_code& ec, list<typename super::in_msg>& msg_can) {unified_out::error_out("send msg error (%d %s)", ec.value(), ec.message().data());}
virtual void on_close()
{
#ifdef ASCS_SYNC_SEND
virtual void on_close() {ascs::do_something_to_all(last_send_msg,
[](typename super::in_msg& msg) {if (msg.p) msg.p->set_value(sync_call_result::NOT_APPLICABLE);}); super::on_close();}
ascs::do_something_to_all(last_send_msg, [](typename super::in_msg& msg) {if (msg.p) msg.p->set_value(sync_call_result::NOT_APPLICABLE);});
#endif
status = link_status::BROKEN;
super::on_close();
}
virtual void on_connect() {}
//msg can not be unpacked
......
......@@ -136,8 +136,8 @@ protected:
if (0 != local_addr.port() || !local_addr.address().is_unspecified())
{
asio::error_code ec;
lowest_object.bind(local_addr, ec); assert(!ec);
if (ec)
lowest_object.bind(local_addr, ec);
if (ec && asio::error::invalid_argument != ec)
{
unified_out::error_out("cannot bind socket: %s", ec.message().data());
return (has_bound = false);
......
......@@ -33,12 +33,20 @@ public:
{
auto socket_ptr(this->create_object());
if (!socket_ptr)
return typename Pool::object_type();
else
{
socket_ptr->set_local_addr(port, ip);
return this->add_socket(socket_ptr) ? socket_ptr : typename Pool::object_type();
}
return socket_ptr;
socket_ptr->set_local_addr(port, ip);
return this->add_socket(socket_ptr) ? socket_ptr : typename Pool::object_type();
}
typename Pool::object_type add_socket(unsigned short port, unsigned short peer_port, const std::string& ip = std::string(), const std::string& peer_ip = std::string())
{
auto socket_ptr(this->create_object());
if (!socket_ptr)
return socket_ptr;
socket_ptr->set_local_addr(port, ip);
socket_ptr->set_peer_addr(peer_port, peer_ip);
return this->add_socket(socket_ptr) ? socket_ptr : typename Pool::object_type();
}
//functions with a socket_ptr parameter will remove the link from object pool first, then call corresponding function
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册