mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #2852: WebRTC: Support only one TCP connected candidate.
This commit is contained in:
parent
efa0851476
commit
2144ff8c40
4 changed files with 51 additions and 13 deletions
|
@ -444,6 +444,7 @@ SrsRtcTcpNetwork::SrsRtcTcpNetwork(SrsRtcConnection* conn, SrsEphemeralDelta* de
|
||||||
transport_ = new SrsSecurityTransport(this);
|
transport_ = new SrsSecurityTransport(this);
|
||||||
peer_port_ = 0;
|
peer_port_ = 0;
|
||||||
state_ = SrsRtcNetworkStateInit;
|
state_ = SrsRtcNetworkStateInit;
|
||||||
|
owner_ = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcTcpNetwork::~SrsRtcTcpNetwork()
|
SrsRtcTcpNetwork::~SrsRtcTcpNetwork()
|
||||||
|
@ -767,7 +768,31 @@ srs_error_t SrsRtcTcpConn::cycle()
|
||||||
return srs_success;
|
return srs_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
// success.
|
||||||
|
if (err == srs_success) {
|
||||||
|
srs_trace("client finished.");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It maybe success with message.
|
||||||
|
if (srs_error_code(err) == ERROR_SUCCESS) {
|
||||||
|
srs_trace("client finished%s.", srs_error_summary(err).c_str());
|
||||||
|
srs_freep(err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// client close peer.
|
||||||
|
// TODO: FIXME: Only reset the error when client closed it.
|
||||||
|
if (srs_is_client_gracefully_close(err)) {
|
||||||
|
srs_warn("client disconnect peer. ret=%d", srs_error_code(err));
|
||||||
|
} else if (srs_is_server_gracefully_close(err)) {
|
||||||
|
srs_warn("server disconnect. ret=%d", srs_error_code(err));
|
||||||
|
} else {
|
||||||
|
srs_error("serve error %s", srs_error_desc(err).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_freep(err);
|
||||||
|
return srs_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcTcpConn::do_cycle()
|
srs_error_t SrsRtcTcpConn::do_cycle()
|
||||||
|
@ -818,19 +843,26 @@ srs_error_t SrsRtcTcpConn::handshake()
|
||||||
if ((err = ping.decode(pkt_, npkt)) != srs_success) {
|
if ((err = ping.decode(pkt_, npkt)) != srs_success) {
|
||||||
return srs_error_wrap(err, "decode stun packet failed");
|
return srs_error_wrap(err, "decode stun packet failed");
|
||||||
}
|
}
|
||||||
if (!session_) {
|
|
||||||
session_ = dynamic_cast<SrsRtcConnection*>(_srs_rtc_manager->find_by_name(ping.get_username()));
|
srs_assert(!session_);
|
||||||
}
|
SrsRtcConnection* session = dynamic_cast<SrsRtcConnection*>(_srs_rtc_manager->find_by_name(ping.get_username()));
|
||||||
if (session_) {
|
// TODO: FIXME: For ICE trickle, we may get STUN packets before SDP answer, so maybe should response it.
|
||||||
session_->switch_to_context();
|
if (!session) {
|
||||||
|
return srs_error_new(ERROR_RTC_TCP_STUN, "no session, stun username=%s", ping.get_username().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session->switch_to_context();
|
||||||
srs_trace("recv stun packet from %s:%d, use-candidate=%d, ice-controlled=%d, ice-controlling=%d",
|
srs_trace("recv stun packet from %s:%d, use-candidate=%d, ice-controlled=%d, ice-controlling=%d",
|
||||||
ip_.c_str(), port_, ping.get_use_candidate(), ping.get_ice_controlled(), ping.get_ice_controlling());
|
ip_.c_str(), port_, ping.get_use_candidate(), ping.get_ice_controlled(), ping.get_ice_controlling());
|
||||||
|
|
||||||
// TODO: FIXME: For ICE trickle, we may get STUN packets before SDP answer, so maybe should response it.
|
// Should support only one TCP candidate.
|
||||||
if (!session_) {
|
SrsRtcTcpNetwork* network = dynamic_cast<SrsRtcTcpNetwork*>(session->tcp());
|
||||||
return srs_error_new(ERROR_RTC_TCP_STUN, "no session, stun username=%s", ping.get_username().c_str());
|
if (!network->owner()) {
|
||||||
|
network->set_owner(this);
|
||||||
|
session_ = session;
|
||||||
|
}
|
||||||
|
if (network->owner() != this) {
|
||||||
|
return srs_error_new(ERROR_RTC_TCP_UNIQUE, "only support one network");
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each binding request, update the TCP socket.
|
// For each binding request, update the TCP socket.
|
||||||
|
@ -838,6 +870,8 @@ srs_error_t SrsRtcTcpConn::handshake()
|
||||||
session_->tcp()->update_sendonly_socket(skt_);
|
session_->tcp()->update_sendonly_socket(skt_);
|
||||||
session_->tcp()->set_peer_id(ip_, port_);
|
session_->tcp()->set_peer_id(ip_, port_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use the session network to handle packet.
|
||||||
return session_->tcp()->on_stun(&ping, pkt_, npkt);
|
return session_->tcp()->on_stun(&ping, pkt_, npkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ class SrsRtcUdpNetwork;
|
||||||
class ISrsRtcNetwork;
|
class ISrsRtcNetwork;
|
||||||
class SrsRtcTcpNetwork;
|
class SrsRtcTcpNetwork;
|
||||||
class SrsRtcDummyNetwork;
|
class SrsRtcDummyNetwork;
|
||||||
|
class SrsRtcTcpConn;
|
||||||
|
|
||||||
// The network stat.
|
// The network stat.
|
||||||
enum SrsRtcNetworkState
|
enum SrsRtcNetworkState
|
||||||
|
@ -176,17 +177,20 @@ private:
|
||||||
SrsRtcConnection* conn_;
|
SrsRtcConnection* conn_;
|
||||||
SrsEphemeralDelta* delta_;
|
SrsEphemeralDelta* delta_;
|
||||||
ISrsProtocolReadWriter* sendonly_skt_;
|
ISrsProtocolReadWriter* sendonly_skt_;
|
||||||
|
private:
|
||||||
// The DTLS transport over this network.
|
// The DTLS transport over this network.
|
||||||
ISrsRtcTransport* transport_;
|
ISrsRtcTransport* transport_;
|
||||||
|
SrsRtcTcpConn* owner_;
|
||||||
|
private:
|
||||||
std::string peer_ip_;
|
std::string peer_ip_;
|
||||||
int peer_port_;
|
int peer_port_;
|
||||||
SrsRtcNetworkState state_;
|
SrsRtcNetworkState state_;
|
||||||
public:
|
public:
|
||||||
SrsRtcTcpNetwork(SrsRtcConnection* conn, SrsEphemeralDelta* delta);
|
SrsRtcTcpNetwork(SrsRtcConnection* conn, SrsEphemeralDelta* delta);
|
||||||
virtual ~SrsRtcTcpNetwork();
|
virtual ~SrsRtcTcpNetwork();
|
||||||
|
public:
|
||||||
|
void set_owner(SrsRtcTcpConn* v) { owner_ = v; }
|
||||||
|
SrsRtcTcpConn* owner() { return owner_; }
|
||||||
void update_sendonly_socket(ISrsProtocolReadWriter* skt);
|
void update_sendonly_socket(ISrsProtocolReadWriter* skt);
|
||||||
//ISrsRtcNetwork
|
//ISrsRtcNetwork
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -551,7 +551,6 @@ srs_error_t SrsRtcServer::do_create_session(SrsRtcUserConfig* ruc, SrsSdp& local
|
||||||
int tcp_port = _srs_config->get_rtc_server_tcp_listen();
|
int tcp_port = _srs_config->get_rtc_server_tcp_listen();
|
||||||
string protocol = _srs_config->get_rtc_server_protocol();
|
string protocol = _srs_config->get_rtc_server_protocol();
|
||||||
|
|
||||||
// TODO: FIXME: Should support only one TCP candidate.
|
|
||||||
set<string> candidates = discover_candidates(ruc);
|
set<string> candidates = discover_candidates(ruc);
|
||||||
for (set<string>::iterator it = candidates.begin(); it != candidates.end(); ++it) {
|
for (set<string>::iterator it = candidates.begin(); it != candidates.end(); ++it) {
|
||||||
string hostname;
|
string hostname;
|
||||||
|
|
|
@ -355,6 +355,7 @@
|
||||||
#define ERROR_RTC_TCP_SIZE 5032
|
#define ERROR_RTC_TCP_SIZE 5032
|
||||||
#define ERROR_RTC_TCP_PACKET 5033
|
#define ERROR_RTC_TCP_PACKET 5033
|
||||||
#define ERROR_RTC_TCP_STUN 5034
|
#define ERROR_RTC_TCP_STUN 5034
|
||||||
|
#define ERROR_RTC_TCP_UNIQUE 5035
|
||||||
|
|
||||||
///////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////
|
||||||
// SRT protocol error.
|
// SRT protocol error.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue