diff --git a/components/net/cpp/include/ftl/net/listener.hpp b/components/net/cpp/include/ftl/net/listener.hpp index 91dc56a260d4810e05382255f8b5119330221fbc..bbf6d0c6aa02623430bc16833a7f0f7cc0bf64da 100644 --- a/components/net/cpp/include/ftl/net/listener.hpp +++ b/components/net/cpp/include/ftl/net/listener.hpp @@ -27,10 +27,13 @@ class Listener { void connection(std::shared_ptr<Peer> &s); void onConnection(connecthandler_t h) { handler_connect_.push_back(h); }; + + inline int port() const { return port_; } private: SOCKET descriptor_; Protocol *default_proto_; + int port_; //sockaddr_in slocalAddr; std::vector<connecthandler_t> handler_connect_; }; diff --git a/components/net/cpp/src/listener.cpp b/components/net/cpp/src/listener.cpp index 14c8f557052da86e9f3afb7a8658f59efa84d590..90ec540f4de09cfb82c763e9b3bf591ad8cf9314 100644 --- a/components/net/cpp/src/listener.cpp +++ b/components/net/cpp/src/listener.cpp @@ -102,7 +102,7 @@ Listener::Listener(const char *pUri) : default_proto_(NULL) { if (uri.getProtocol() == URI::SCHEME_TCP) { descriptor_ = tcpListen(uri); - std::cout << "Listening: " << pUri << " - " << descriptor_ << std::endl; + port_ = uri.getPort(); } else if (uri.getProtocol() == URI::SCHEME_WS) { descriptor_ = wsListen(uri); } else { diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp index dd56ef9356d86c22ceb65657d44e31d40ede61e6..7a6b3404eebb2db338bd1243ae4c7ceb00a077e3 100644 --- a/components/net/cpp/src/universe.cpp +++ b/components/net/cpp/src/universe.cpp @@ -149,14 +149,24 @@ bool Universe::listen(const string &addr) { } Peer *Universe::connect(const string &addr) { - // Check if already connected + // Check if already connected or if self { UNIQUE_LOCK(net_mutex_,lk); if (peer_by_uri_.find(addr) != peer_by_uri_.end()) { return peer_by_uri_[addr]; } + + ftl::URI u(addr); + if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") { + for (const auto *l : listeners_) { + if (l->port() == u.getPort()) { + throw FTL_Error("Cannot connect to self"); + } + } + } } + auto p = new Peer(addr.c_str(), this, &disp_); if (!p) return nullptr; @@ -263,6 +273,29 @@ Peer *Universe::getPeer(const UUID &id) const { void Universe::_periodic() { auto i = reconnects_.begin(); while (i != reconnects_.end()) { + + std::string addr = i->peer->getURI(); + + { + UNIQUE_LOCK(net_mutex_,lk); + ftl::URI u(addr); + bool removed = false; + + if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") { + for (const auto *l : listeners_) { + if (l->port() == u.getPort()) { + LOG(ERROR) << "Cannot connect to self"; + garbage_.push_back((*i).peer); + i = reconnects_.erase(i); + removed = true; + break; + } + } + } + + if (removed) continue; + } + if ((*i).peer->reconnect()) { UNIQUE_LOCK(net_mutex_,lk); peers_.push_back((*i).peer);