summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/session_base.cpp15
-rw-r--r--src/session_base.hpp10
2 files changed, 20 insertions, 5 deletions
diff --git a/src/session_base.cpp b/src/session_base.cpp
index be7d429..b752f9f 100644
--- a/src/session_base.cpp
+++ b/src/session_base.cpp
@@ -114,7 +114,9 @@ xs::session_base_t::session_base_t (class io_thread_t *io_thread_,
socket (socket_),
io_thread (io_thread_),
send_identity (options_.send_identity),
+ identity_sent (false),
recv_identity (options_.recv_identity),
+ identity_recvd (false),
linger_timer (NULL)
{
if (protocol_)
@@ -150,11 +152,11 @@ void xs::session_base_t::attach_pipe (pipe_t *pipe_)
int xs::session_base_t::read (msg_t *msg_)
{
// First message to send is identity (if required).
- if (send_identity) {
+ if (send_identity && !identity_sent) {
xs_assert (!(msg_->flags () & msg_t::more));
msg_->init_size (options.identity_size);
memcpy (msg_->data (), options.identity, options.identity_size);
- send_identity = false;
+ identity_sent = true;
incomplete_in = false;
return 0;
}
@@ -171,9 +173,9 @@ int xs::session_base_t::read (msg_t *msg_)
int xs::session_base_t::write (msg_t *msg_)
{
// First message to receive is identity (if required).
- if (recv_identity) {
+ if (recv_identity && !identity_recvd) {
msg_->set_flags (msg_t::identity);
- recv_identity = false;
+ identity_recvd = true;
}
if (pipe && pipe->write (msg_)) {
@@ -301,6 +303,11 @@ void xs::session_base_t::detach ()
// Engine is dead. Let's forget about it.
engine = NULL;
+ // In case identities are sent/received, remember we yet hato to send/recv
+ // one from the new connection.
+ identity_sent = false;
+ identity_recvd = false;
+
// Remove any half-done messages from the pipes.
clean_pipes ();
diff --git a/src/session_base.hpp b/src/session_base.hpp
index 8b0d019..47da8c2 100644
--- a/src/session_base.hpp
+++ b/src/session_base.hpp
@@ -118,10 +118,18 @@ namespace xs
// the engines into the same thread.
xs::io_thread_t *io_thread;
- // If true, identity is to be sent/recvd from the network.
+ // If true, identity is to be sent to the network.
bool send_identity;
+
+ // If true, identity was already sent to the current connection.
+ bool identity_sent;
+
+ // If true, identity is to be received from the network.
bool recv_identity;
+ // If true, identity was already received from the current connection.
+ bool identity_recvd;
+
// Protocol and address to use when connecting.
std::string protocol;
std::string address;