Connection manager seems to work...

This commit is contained in:
brunoherbelin
2020-10-23 19:01:44 +02:00
parent 43f444f07b
commit 509416d5a0
2 changed files with 33 additions and 29 deletions

View File

@@ -10,12 +10,17 @@
#include "Connection.h"
#include "Log.h"
#ifndef NDEBUG
#define CONNECTION_DEBUG
#endif
Connection::Connection()
{
receiver_ = nullptr;
}
bool Connection::init()
{
// add default info for myself
@@ -34,11 +39,10 @@ bool Connection::init()
// through exception runtime if fails
receiver_ = new UdpListeningReceiveSocket( IpEndpointName( IpEndpointName::ANY_ADDRESS,
connections_[0].port_handshake ), &listener_ );
// all good
trial = MAX_HANDSHAKE;
}
catch(const std::runtime_error& e) {
catch (const std::runtime_error& e) {
// arg, the receiver could not be initialized
// because the port was not available
receiver_ = nullptr;
@@ -49,13 +53,10 @@ bool Connection::init()
// perfect, we could initialize the receiver
if (receiver_!=nullptr) {
// listen for answers
std::thread(listen).detach();
// regularly check for available streaming hosts
std::thread(ask).detach();
}
return receiver_ != nullptr;
@@ -106,14 +107,14 @@ int Connection::index(ConnectionInfo i) const
void Connection::listen()
{
// Log::Info("Accepting handshake on %d", Connection::manager().connections_[0].port_handshake);
#ifdef CONNECTION_DEBUG
Log::Info("Accepting handshake on port %d", Connection::manager().connections_[0].port_handshake);
#endif
Connection::manager().receiver_->Run();
}
void Connection::ask()
{
// Log::Info("Broadcasting handshakes with info %d", Connection::manager().connections_[0].port_handshake);
// prepare OSC PING message
char buffer[IP_MTU_SIZE];
osc::OutboundPacketStream p( buffer, IP_MTU_SIZE );
@@ -132,12 +133,6 @@ void Connection::ask()
// loop infinitely
while(true)
{
// set status to pending : after pong status will be confirmed
for(auto it=Connection::manager().connections_.begin(); it!=Connection::manager().connections_.end(); it++) {
(*it).status--;
}
// broadcast the PING message on every possible ports
for(auto it=handshake_ports.begin(); it!=handshake_ports.end(); it++) {
IpEndpointName host( "255.255.255.255", (*it) );
@@ -149,14 +144,22 @@ void Connection::ask()
// wait a bit
std::this_thread::sleep_for(std::chrono::milliseconds(500));
// check if status decreased
// check the list of connections for non responding (disconnected)
for(auto it=Connection::manager().connections_.begin(); it!=Connection::manager().connections_.end(); ) {
if ( it!=Connection::manager().connections_.begin() && (*it).status < 1 )
// decrease life score
(*it).alive--;
// erase connection if its life score is negative (not responding too many times)
if ( it!=Connection::manager().connections_.begin() && (*it).alive < 0 ) {
it = Connection::manager().connections_.erase(it);
#ifdef CONNECTION_DEBUG
Log::Info("A connection was lost");
Connection::manager().print();
#endif
}
// loop
else
it++;
}
// Connection::manager().print();
}
}
@@ -179,8 +182,6 @@ void ConnectionRequestListener::ProcessMessage( const osc::ReceivedMessage& m,
osc::ReceivedMessage::const_iterator arg = m.ArgumentsBegin();
int remote_port = (arg++)->AsInt32();
// Log::Info("Receive PING from %s:%d", remote_ip.c_str(), remote_port);
// build message
char buffer[IP_MTU_SIZE];
osc::OutboundPacketStream p( buffer, IP_MTU_SIZE );
@@ -196,7 +197,6 @@ void ConnectionRequestListener::ProcessMessage( const osc::ReceivedMessage& m,
UdpTransmitSocket socket( host );
socket.Send( p.Data(), p.Size() );
// Log::Info("reply PONG to %s:%d", remote_ip.c_str(), remote_port);
}
// pong response: add info
else if( std::strcmp( m.AddressPattern(), OSC_PREFIX OSC_PONG) == 0 ){
@@ -211,17 +211,19 @@ void ConnectionRequestListener::ProcessMessage( const osc::ReceivedMessage& m,
info.port_stream_send = (arg++)->AsInt32();
info.port_stream_receive = (arg++)->AsInt32();
// do we know this connection ?
int i = Connection::manager().index(info);
if ( i < 0) {
// add to list
info.status = 3;
// a new connection! Add to list
Connection::manager().connections_.push_back(info);
// Log::Info("Received PONG from %s:%d : added", info.address_.c_str(), info.port_handshake);
// Connection::manager().print();
#ifdef CONNECTION_DEBUG
Log::Info("New connection added");
Connection::manager().print();
#endif
}
else {
// set high (== ALIVE)
Connection::manager().connections_[i].status = 3;
// we know this connection: keep its status to ALIVE
Connection::manager().connections_[i].alive = ALIVE;
}
}

View File

@@ -7,6 +7,8 @@
#include "NetworkToolkit.h"
#define ALIVE 3
class ConnectionRequestListener : public osc::OscPacketListener {
protected:
@@ -20,14 +22,14 @@ struct ConnectionInfo {
int port_handshake;
int port_stream_send;
int port_stream_receive;
int status;
int alive;
ConnectionInfo () {
address_ = "localhost";
port_handshake = HANDSHAKE_PORT;
port_stream_send = STREAM_REQUEST_PORT;
port_stream_receive = STREAM_RESPONSE_PORT;
status = 0;
alive = ALIVE;
}
inline ConnectionInfo& operator = (const ConnectionInfo& o)