multiplex: all sessions share a single socketfactory

This commit is contained in:
Heikki Tampio 2023-04-05 09:30:27 +03:00
parent ac7023f9f3
commit 076f06c57d
6 changed files with 58 additions and 14 deletions

View File

@ -4,11 +4,13 @@
#include <map>
#include <string>
#include <memory>
namespace uvgrtp {
class session;
class socketfactory;
/**
* \brief Provides CNAME isolation and can be used to create uvgrtp::session objects
@ -61,6 +63,9 @@ namespace uvgrtp {
*/
uvgrtp::session *create_session(std::string remote_addr, std::string local_addr);
uvgrtp::session* create_session(std::string remote_addr, std::string local_addr, bool sfp);
/**
* \brief Destroy RTP session and all of its media streams
*
@ -91,6 +96,7 @@ namespace uvgrtp {
/* CNAME is the same for all connections */
std::string cname_;
std::shared_ptr<uvgrtp::socketfactory> sfp_;
};
}

View File

@ -29,6 +29,7 @@ namespace uvgrtp {
/// \cond DO_NOT_DOCUMENT
session(std::string cname, std::string addr);
session(std::string cname, std::string remote_addr, std::string local_addr);
session(std::string cname, std::string remote_addr, std::string local_addr, std::shared_ptr<uvgrtp::socketfactory> sfp);
~session();
/// \endcond

View File

@ -7,6 +7,7 @@
#include "debug.hh"
#include "hostname.hh"
#include "random.hh"
#include "socketfactory.hh"
#include <cstdlib>
#include <cstring>
@ -37,6 +38,7 @@ uvgrtp::context::context()
UVG_LOG_INFO("uvgRTP version: %s", uvgrtp::get_version().c_str());
cname_ = uvgrtp::context::generate_cname();
sfp_ = std::make_shared<uvgrtp::socketfactory>(RCE_NO_FLAGS);
#ifdef _WIN32
WSADATA wsd;
@ -78,6 +80,21 @@ uvgrtp::session *uvgrtp::context::create_session(std::string remote_addr, std::s
return new uvgrtp::session(get_cname(), remote_addr, local_addr);
}
uvgrtp::session* uvgrtp::context::create_session(std::string remote_addr, std::string local_addr, bool sfp)
{
if (remote_addr == "" && local_addr == "")
{
UVG_LOG_ERROR("Please specify at least one address for create_session");
return nullptr;
}
if (sfp == true) {
return new uvgrtp::session(get_cname(), remote_addr, local_addr, sfp_);
}
else {
return nullptr;
}
}
rtp_error_t uvgrtp::context::destroy_session(uvgrtp::session *session)
{
if (!session)

View File

@ -30,6 +30,19 @@ uvgrtp::session::session(std::string cname, std::string remote_addr, std::string
sf_->set_local_interface(local_addr);
}
uvgrtp::session::session(std::string cname, std::string remote_addr, std::string local_addr, std::shared_ptr<uvgrtp::socketfactory> sfp) :
#ifdef __RTP_CRYPTO__
zrtp_(new uvgrtp::zrtp()),
#endif
generic_address_(""),
remote_address_(remote_addr),
local_address_(local_addr),
cname_(cname),
sf_(sfp)
{
sf_->set_local_interface(local_addr);
}
uvgrtp::session::~session()
{
for (auto&i : streams_) {

View File

@ -8,6 +8,7 @@
#include <netdb.h>
#include <netinet/in.h>
#endif
#include <algorithm>
uvgrtp::socketfactory::socketfactory(int rce_flags) :
rce_flags_(rce_flags),
@ -15,7 +16,8 @@ uvgrtp::socketfactory::socketfactory(int rce_flags) :
local_port_(),
ipv6_(false),
socket_(std::shared_ptr<uvgrtp::socket>(new uvgrtp::socket(rce_flags))),
local_bound_(false)
local_bound_(false),
used_ports_({})
{}
uvgrtp::socketfactory::~socketfactory()
@ -57,20 +59,23 @@ rtp_error_t uvgrtp::socketfactory::set_local_interface(std::string local_addr)
rtp_error_t uvgrtp::socketfactory::bind_local_socket(uint16_t local_port)
{
rtp_error_t ret;
local_port_ = local_port;
if (ipv6_) {
sockaddr_in6 bind_addr6 = socket_->create_ip6_sockaddr(local_address_, local_port_);
ret = socket_->bind_ip6(bind_addr6);
}
else {
sockaddr_in bind_addr = socket_->create_sockaddr(AF_INET, local_address_, local_port_);
ret = socket_->bind(bind_addr);
}
if (ret == RTP_OK) {
local_bound_ = true;
rtp_error_t ret = RTP_OK;
if (std::find(used_ports_.begin(), used_ports_.end(), local_port) == used_ports_.end()) {
if (ipv6_) {
sockaddr_in6 bind_addr6 = socket_->create_ip6_sockaddr(local_address_, local_port);
ret = socket_->bind_ip6(bind_addr6);
}
else {
sockaddr_in bind_addr = socket_->create_sockaddr(AF_INET, local_address_, local_port);
ret = socket_->bind(bind_addr);
}
if (ret == RTP_OK) {
used_ports_.push_back(local_port);
local_bound_ = true;
}
}
// = local_port;
return ret;
}

View File

@ -3,6 +3,7 @@
#include "uvgrtp/util.hh"
#include <string>
#include <memory>
#include <vector>
namespace uvgrtp {
@ -26,6 +27,7 @@ namespace uvgrtp {
bool ipv6_;
std::shared_ptr<uvgrtp::socket> socket_;
bool local_bound_;
std::vector<uint16_t> used_ports_;
};
}