multiplex: socketfactory is used to distribute and control sockets
This commit is contained in:
parent
6bb49cccc9
commit
9e8678e433
|
@ -63,9 +63,6 @@ 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
|
||||
*
|
||||
|
|
|
@ -28,7 +28,6 @@ namespace uvgrtp {
|
|||
public:
|
||||
/// \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
|
||||
|
|
|
@ -80,19 +80,15 @@ 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)
|
||||
uvgrtp::session* uvgrtp::context::create_session(std::string remote_addr, std::string local_addr)
|
||||
{
|
||||
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;
|
||||
}
|
||||
sfp_ = std::make_shared<uvgrtp::socketfactory>(0);
|
||||
return new uvgrtp::session(get_cname(), remote_addr, local_addr, sfp_);
|
||||
}
|
||||
|
||||
rtp_error_t uvgrtp::context::destroy_session(uvgrtp::session *session)
|
||||
|
|
|
@ -17,20 +17,7 @@ uvgrtp::session::session(std::string cname, std::string addr) :
|
|||
cname_(cname)
|
||||
{}
|
||||
|
||||
uvgrtp::session::session(std::string cname, std::string remote_addr, std::string local_addr):
|
||||
#ifdef __RTP_CRYPTO__
|
||||
zrtp_(new uvgrtp::zrtp()),
|
||||
#endif
|
||||
generic_address_(""),
|
||||
remote_address_(remote_addr),
|
||||
local_address_(local_addr),
|
||||
cname_(cname),
|
||||
sf_(std::shared_ptr<uvgrtp::socketfactory>(new uvgrtp::socketfactory(RCE_NO_FLAGS)))
|
||||
{
|
||||
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) :
|
||||
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
|
||||
|
|
|
@ -13,11 +13,10 @@
|
|||
uvgrtp::socketfactory::socketfactory(int rce_flags) :
|
||||
rce_flags_(rce_flags),
|
||||
local_address_(""),
|
||||
local_port_(),
|
||||
used_ports_({}),
|
||||
ipv6_(false),
|
||||
socket_(std::shared_ptr<uvgrtp::socket>(new uvgrtp::socket(rce_flags))),
|
||||
local_bound_(false),
|
||||
used_ports_({})
|
||||
used_sockets_({}),
|
||||
local_bound_(false)
|
||||
{}
|
||||
|
||||
uvgrtp::socketfactory::~socketfactory()
|
||||
|
@ -28,7 +27,7 @@ rtp_error_t uvgrtp::socketfactory::set_local_interface(std::string local_addr)
|
|||
rtp_error_t ret = RTP_GENERIC_ERROR;
|
||||
|
||||
local_address_ = local_addr;
|
||||
// check IP address family and initialize the socket
|
||||
// check IP address family
|
||||
struct addrinfo hint, * res = NULL;
|
||||
memset(&hint, '\0', sizeof(hint));
|
||||
hint.ai_family = PF_UNSPEC;
|
||||
|
@ -41,41 +40,49 @@ rtp_error_t uvgrtp::socketfactory::set_local_interface(std::string local_addr)
|
|||
ipv6_ = true;
|
||||
|
||||
}
|
||||
if ((ret = socket_->init(res->ai_family, SOCK_DGRAM, 0)) != RTP_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/* Make the socket non-blocking */
|
||||
int enabled = 1;
|
||||
|
||||
if (::ioctlsocket(socket_->get_raw_socket(), FIONBIO, (u_long*)&enabled) < 0) {
|
||||
return RTP_GENERIC_ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
return RTP_OK;
|
||||
}
|
||||
|
||||
rtp_error_t uvgrtp::socketfactory::bind_local_socket(uint16_t local_port)
|
||||
rtp_error_t uvgrtp::socketfactory::create_new_socket(uint16_t local_port)
|
||||
{
|
||||
rtp_error_t ret = RTP_OK;
|
||||
|
||||
if (std::find(used_ports_.begin(), used_ports_.end(), local_port) == used_ports_.end()) {
|
||||
std::shared_ptr<uvgrtp::socket> socket = std::make_shared<uvgrtp::socket>(new uvgrtp::socket(rce_flags_));
|
||||
|
||||
if (ipv6_) {
|
||||
sockaddr_in6 bind_addr6 = socket_->create_ip6_sockaddr(local_address_, local_port);
|
||||
ret = socket_->bind_ip6(bind_addr6);
|
||||
if ((ret = socket->init(AF_INET6, SOCK_DGRAM, 0)) != RTP_OK) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
else {
|
||||
sockaddr_in bind_addr = socket_->create_sockaddr(AF_INET, local_address_, local_port);
|
||||
ret = socket_->bind(bind_addr);
|
||||
if ((ret = socket->init(AF_INET6, SOCK_DGRAM, 0)) != RTP_OK) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#ifdef _WIN32
|
||||
/* Make the socket non-blocking */
|
||||
int enabled = 1;
|
||||
|
||||
if (::ioctlsocket(socket->get_raw_socket(), FIONBIO, (u_long*)&enabled) < 0) {
|
||||
return RTP_GENERIC_ERROR;
|
||||
}
|
||||
#endif
|
||||
used_sockets_.push_back(socket);
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,19 +15,19 @@ namespace uvgrtp {
|
|||
~socketfactory();
|
||||
|
||||
rtp_error_t set_local_interface(std::string local_addr);
|
||||
rtp_error_t bind_local_socket(uint16_t local_port);
|
||||
rtp_error_t create_new_socket(uint16_t local_port);
|
||||
|
||||
bool get_local_bound() const;
|
||||
std::shared_ptr<uvgrtp::socket> get_socket_ptr() const;
|
||||
|
||||
private:
|
||||
|
||||
int rce_flags_;
|
||||
std::string local_address_;
|
||||
uint16_t local_port_;
|
||||
bool ipv6_;
|
||||
std::shared_ptr<uvgrtp::socket> socket_;
|
||||
bool local_bound_;
|
||||
std::vector<uint16_t> used_ports_;
|
||||
bool ipv6_;
|
||||
std::vector<std::shared_ptr<uvgrtp::socket>> used_sockets_;
|
||||
bool local_bound_;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue