From 2de5029eb49c484f18e81d10bd3a2724a21a2bdd Mon Sep 17 00:00:00 2001 From: Tihomir Heidelberg <9a4gl@hamradio.hr> Date: Sat, 1 Apr 2017 18:49:12 +0200 Subject: [PATCH] Add support for TURN relay --- inc/PeerConnectionManager.h | 5 ++++- src/PeerConnectionManager.cpp | 42 ++++++++++++++++++++++++++++++++++++++++-- src/main.cpp | 13 ++++++++----- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/inc/PeerConnectionManager.h b/inc/PeerConnectionManager.h index 501d379..7f92b46 100644 --- a/inc/PeerConnectionManager.h +++ b/inc/PeerConnectionManager.h @@ -113,7 +113,7 @@ class PeerConnectionManager { }; public: - PeerConnectionManager(const std::string & stunurl, const std::list & urlList); + PeerConnectionManager(const std::string & stunurl, const std::string & turnurl, const std::list & urlList); virtual ~PeerConnectionManager(); bool InitializePeerConnection(); @@ -142,6 +142,9 @@ class PeerConnectionManager { std::map peer_connectionobs_map_; std::map > stream_map_; std::string stunurl_; + std::string turnurl_; + std::string turnuser_; + std::string turnpass_; const std::list urlList_; }; diff --git a/src/PeerConnectionManager.cpp b/src/PeerConnectionManager.cpp index 932f516..2615afa 100644 --- a/src/PeerConnectionManager.cpp +++ b/src/PeerConnectionManager.cpp @@ -35,11 +35,31 @@ const char kSessionDescriptionSdpName[] = "sdp"; /* --------------------------------------------------------------------------- ** Constructor ** -------------------------------------------------------------------------*/ -PeerConnectionManager::PeerConnectionManager(const std::string & stunurl, const std::list & urlList) +PeerConnectionManager::PeerConnectionManager(const std::string & stunurl, const std::string & turnurl, const std::list & urlList) : peer_connection_factory_(webrtc::CreatePeerConnectionFactory()) , stunurl_(stunurl) + , turnurl_(turnurl) , urlList_(urlList) { + if (turnurl_.length() > 0) + { + std::size_t pos = turnurl_.find('@'); + if (pos != std::string::npos) + { + std::string credentials = turnurl_.substr(0, pos); + pos = credentials.find(':'); + if (pos == std::string::npos) + { + turnuser_ = credentials; + } + else + { + turnuser_ = credentials.substr(0, pos); + turnpass_ = credentials.substr(pos + 1); + } + turnurl_ = turnurl_.substr(pos + 1); + } + } } /* --------------------------------------------------------------------------- @@ -94,6 +114,15 @@ const Json::Value PeerConnectionManager::getIceServers() Json::Value urls; urls.append(url); + if (turnurl_.length() > 0) + { + Json::Value turn; + turn["url"] = "turn:" + turnurl_; + if (turnuser_.length() > 0) turn["username"] = turnuser_; + if (turnpass_.length() > 0) turn["credential"] = turnpass_; + urls.append(turn); + } + Json::Value iceServers; iceServers["iceServers"] = urls; @@ -456,7 +485,16 @@ PeerConnectionManager::PeerConnectionObserver* PeerConnectionManager::CreatePeer server.username = ""; server.password = ""; config.servers.push_back(server); - + + if (stunurl_.length() > 0) + { + webrtc::PeerConnectionInterface::IceServer turnserver; + turnserver.uri = "turn:" + turnurl_; + turnserver.username = turnuser_; + turnserver.password = turnpass_; + config.servers.push_back(turnserver); + } + webrtc::FakeConstraints constraints; constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, "true"); diff --git a/src/main.cpp b/src/main.cpp index e8b1adf..b26cb3a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ ** -------------------------------------------------------------------------*/ int main(int argc, char* argv[]) { + const char* turnurl = 0; const char* localstunurl = "127.0.0.1:3478"; const char* stunurl = "stun.l.google.com:19302"; int logLevel = rtc::LERROR; @@ -37,7 +38,7 @@ int main(int argc, char* argv[]) defaultAddress.append(std::to_string(defaultPort)); int c = 0; - while ((c = getopt (argc, argv, "hH:v::w:" "S:s::")) != -1) + while ((c = getopt (argc, argv, "hH:v::w:" "t:S:s::")) != -1) { switch (c) { @@ -45,18 +46,20 @@ int main(int argc, char* argv[]) case 'H': defaultAddress = optarg; break; case 'w': webroot = optarg; break; + case 't': turnurl = optarg; break; case 'S': localstunurl = optarg; stunurl = localstunurl; break; case 's': localstunurl = NULL; if (optarg) stunurl = optarg; break; case 'h': default: - std::cout << argv[0] << " [-H http port] [-S embeded stun address] -[v[v]] [url1]...[urln]" << std::endl; - std::cout << argv[0] << " [-H http port] [-s externel stun address] -[v[v]] [url1]...[urln]" << std::endl; + std::cout << argv[0] << " [-H http port] [-S embeded stun address] [-t [username:password@]turn_address] -[v[v]] [url1]...[urln]" << std::endl; + std::cout << argv[0] << " [-H http port] [-s externel stun address] [-t [username:password@]turn_address] -[v[v]] [url1]...[urln]" << std::endl; std::cout << "\t -v[v[v]] : verbosity" << std::endl; std::cout << "\t -H hostname:port : HTTP server binding (default " << defaultAddress << ")" << std::endl; - std::cout << "\t -w webroot : path to get files" << std::endl; + std::cout << "\t -w webroot : path to get files" << std::endl; std::cout << "\t -S stun_address : start embeded STUN server bind to address (default " << localstunurl << ")" << std::endl; std::cout << "\t -s[stun_address] : use an external STUN server (default " << stunurl << ")" << std::endl; + std::cout << "\t -t[username:password@]turn_address : use an external TURN relay server (default disabled)" << std::endl; std::cout << "\t [url] : url to register in the source list" << std::endl; exit(0); } @@ -78,7 +81,7 @@ int main(int argc, char* argv[]) rtc::InitializeSSL(); // webrtc server - PeerConnectionManager webRtcServer(stunurl, urlList); + PeerConnectionManager webRtcServer(stunurl, turnurl, urlList); if (!webRtcServer.InitializePeerConnection()) { std::cout << "Cannot Initialize WebRTC server" << std::endl; -- 2.11.0