For #2852: WebRTC: Support only one TCP connected candidate.

pull/3177/head
winlin 2 years ago
parent efa0851476
commit 2144ff8c40

@ -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…
Cancel
Save