diff --git a/src/server.cpp b/src/server.cpp index 7fb6f7c..f58af49 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -305,10 +305,12 @@ Server::Pvt::Pvt(Config&& conf) acceptor_loop.call([this, &dummy](){ // from acceptor worker + bool firstiface = true; for(const auto& addr : effective.interfaces) { - interfaces.emplace_back(addr, effective.tcp_port, this); - if(effective.tcp_port==0) + interfaces.emplace_back(addr, effective.tcp_port, this, firstiface); + if(firstiface || effective.tcp_port==0) effective.tcp_port = interfaces.back().bind_addr.port(); + firstiface = false; } for(const auto& addr : effective.beaconDestinations) { diff --git a/src/serverconn.cpp b/src/serverconn.cpp index 7d65ecd..f36d5a6 100644 --- a/src/serverconn.cpp +++ b/src/serverconn.cpp @@ -508,7 +508,7 @@ void ServerConn::bevWriteS(struct bufferevent *bev, void *ptr) } } -ServIface::ServIface(const std::string& addr, unsigned short port, server::Server::Pvt *server) +ServIface::ServIface(const std::string& addr, unsigned short port, server::Server::Pvt *server, bool fallback) :server(server) ,bind_addr(AF_INET, addr.c_str(), port) ,sock(AF_INET, SOCK_STREAM, 0) @@ -520,7 +520,7 @@ ServIface::ServIface(const std::string& addr, unsigned short port, server::Serve try { sock.bind(bind_addr); } catch(std::system_error& e) { - if(e.code().value()==SOCK_EADDRINUSE && bind_addr.port()!=0) { + if(fallback && e.code().value()==SOCK_EADDRINUSE) { bind_addr.setPort(0); continue; } diff --git a/src/serverconn.h b/src/serverconn.h index 9df90ae..dc1e431 100644 --- a/src/serverconn.h +++ b/src/serverconn.h @@ -168,7 +168,7 @@ struct ServIface evsocket sock; evlisten listener; - ServIface(const std::string& addr, unsigned short port, server::Server::Pvt *server); + ServIface(const std::string& addr, unsigned short port, server::Server::Pvt *server, bool fallback); static void onConnS(struct evconnlistener *listener, evutil_socket_t sock, struct sockaddr *peer, int socklen, void *raw); };