1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

WebRTC: Support TCP network.

This commit is contained in:
Li Peng 2022-09-04 20:19:01 +08:00 committed by winlin
parent 625069af7f
commit 07339e1417
5 changed files with 565 additions and 4 deletions

View file

@ -29,6 +29,8 @@ class SrsEphemeralDelta;
class ISrsKbpsDelta;
class SrsRtcUdpNetwork;
class ISrsRtcNetwork;
class SrsRtcTcpNetwork;
class SrsRtcDummyNetwork;
// The network stat.
enum SrsRtcNetworkState
@ -47,6 +49,10 @@ class SrsRtcNetworks
private:
// Network over UDP.
SrsRtcUdpNetwork* udp_;
// Network over TCP
SrsRtcTcpNetwork* tcp_;
// Network over dummy
SrsRtcDummyNetwork* dummy_;
private:
// WebRTC session object.
SrsRtcConnection* conn_;
@ -63,6 +69,7 @@ public:
void set_state(SrsRtcNetworkState state);
// Get the UDP network object.
SrsRtcUdpNetwork* udp();
SrsRtcTcpNetwork* tcp();
// Get an available network.
ISrsRtcNetwork* available();
public:
@ -73,6 +80,9 @@ public:
// For DTLS or Session to call network service.
class ISrsRtcNetwork : public ISrsStreamWriter
{
protected:
bool establelished_;
public:
ISrsRtcNetwork();
virtual ~ISrsRtcNetwork();
@ -86,6 +96,27 @@ public:
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher) = 0;
// Protect RTCP packet by SRTP context.
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher) = 0;
public:
bool is_establelished();
};
// Dummy networks
class SrsRtcDummyNetwork : public ISrsRtcNetwork
{
public:
SrsRtcDummyNetwork();
virtual ~SrsRtcDummyNetwork();
// The interface of ISrsRtcNetwork
public:
virtual srs_error_t on_connection_established();
virtual srs_error_t on_dtls_alert(std::string type, std::string desc);
public:
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher);
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher);
// Interface ISrsStreamWriter.
public:
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
};
// The WebRTC over UDP network.
@ -141,8 +172,64 @@ public:
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
};
class SrsRtcTcpNetwork: public ISrsRtcNetwork
{
private:
SrsRtcConnection* conn_;
SrsEphemeralDelta* delta_;
ISrsProtocolReadWriter* sendonly_skt_;
// The DTLS transport over this network.
ISrsRtcTransport* transport_;
std::string peer_ip_;
int peer_port_;
SrsRtcNetworkState state_;
public:
SrsRtcTcpNetwork(SrsRtcConnection* conn, SrsEphemeralDelta* delta);
virtual ~SrsRtcTcpNetwork();
void update_sendonly_socket(ISrsProtocolReadWriter* skt);
//ISrsRtcNetwork
public:
// Callback when DTLS connected.
virtual srs_error_t on_connection_established();
// Callback when DTLS disconnected.
virtual srs_error_t on_dtls_alert(std::string type, std::string desc);
// Protect RTP packet by SRTP context.
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher);
// Protect RTCP packet by SRTP context.
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher);
// When got STUN ping message. The peer address may change, we can identify that by STUN messages.
srs_error_t on_stun(SrsStunPacket* r, char* data, int nb_data);
private:
srs_error_t on_binding_request(SrsStunPacket* r, std::string ice_pwd);
// DTLS transport functions.
public:
srs_error_t initialize(SrsSessionConfig* cfg, bool dtls, bool srtp);
virtual srs_error_t start_active_handshake();
virtual srs_error_t on_dtls(char* data, int nb_data);
// When got data from socket.
public:
srs_error_t on_rtcp(char* data, int nb_data);
srs_error_t on_rtp(char* data, int nb_data);
// Other functions.
public:
// Connection level state machine, for ARQ of UDP packets.
void set_state(SrsRtcNetworkState state);
// ICE reflexive address functions.
std::string get_peer_ip();
int get_peer_port();
// Interface ISrsStreamWriter.
public:
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
public:
void set_peer_id(const std::string& ip, int port);
};
// For WebRTC over TCP.
class SrsRtcTcpConn : public ISrsConnection, public ISrsStartable, public ISrsCoroutineHandler
class SrsRtcTcpConn : public ISrsConnection, public ISrsStartable, public ISrsCoroutineHandler, public ISrsDisposingHandler
{
private:
// The manager object to manage the connection.
@ -154,7 +241,10 @@ private:
int port_;
// The delta for statistic.
SrsNetworkDelta* delta_;
// TCP Transport object.
// WebRTC session object.
SrsRtcConnection* session_;
bool disposing_;
ISrsProtocolReadWriter* skt_;
public:
SrsRtcTcpConn(ISrsProtocolReadWriter* skt, std::string cip, int port, ISrsResourceManager* cm);
@ -176,6 +266,11 @@ public:
virtual srs_error_t cycle();
private:
virtual srs_error_t do_cycle();
srs_error_t on_tcp_pkt(char* pkt, int nb_pkt);
// Interface of ISrsDisposingHandler
public:
virtual void on_before_dispose(ISrsResource* c);
virtual void on_disposing(ISrsResource* c);
};
#endif