srs 如何集成rannet

本文提出了一种基于RakNet的UDP整合方案,通过增加监听类和调整现有类来处理UDP连接和数据。具体包括新增IRakListenerHandler接口及其实现、SrsServer类中的连接处理、SrsRtmpConn类中UDP连接的支持以及SrsStSocket类中UDP功能的增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译的问题上一篇已经解决了。

这篇主要解决如何在代码层面来整合。只是大概的框架。还没有完全成熟。

1)增加属于udp的listener类

代码为:

struct IRakListenerHandler
{
	IRakListenerHandler();
	~IRakListenerHandler();

	virtual int on_udp_connect(RakNetGUID guid) = 0;

};
struct   IRakNetDealer
{
	IRakNetDealer(){};
	~IRakNetDealer(){};
	virtual void deal_udp_data(Packet *packet)=0;
};

//includer one thread ,all udp data dealby this thread;
class CUdpListenerByRaknet 
{
public:
	CUdpListenerByRaknet(IRakListenerHandler *h);
	~CUdpListenerByRaknet();

	void    deal_udp_data(Packet *packet);
	void    RegPackHandler(IRakNetDealer *handler);

protected:
	map<RakNetGUID, IRakNetDealer *>m_packDealer;
	IRakListenerHandler *   m_listenHandler;
private:
};

核心类为CUdpListenerByRaknet,由于udp连接的的特性是无连接的,所有区别连接要靠raknet本身的guid来做判断,而且,没有专门的连接 数据包的区别,所以这个类既要负责tcp的accept功能,又要负责rev的功能。次类中应该有线程的存在。


1)在class SrsServer类有继承IRakListenerHandler接口,实现在udp有新的连接上来的时候,创建对应的conn类,代码如下

class SrsServer : virtual public ISrsReloadHandler
    , virtual public ISrsSourceHandler, virtual public ISrsHlsHandler
	, virtual public IConnectionManager, public IRakListenerHandler
虚函数的实现
virtual int accept_client::on_udp_connect(RakNetGUID guid)
{
	SrsConnection* conn = NULL;
	conn = new SrsRtmpConn(this, guid);
	conns.push_back(conn);



	return 0;
}


3)SrsRtmpConn类要增加一个构造函数可以构造udp的连接

SrsRtmpConn(SrsServer* svr, RakNetGUID guid);

实现为

SrsRtmpConn::SrsRtmpConn(SrsServer* svr, RakNetGUID guid)
{
	server = svr;
	req = new SrsRequest();
	res = new SrsResponse();
	skt = new SrsStSocket(guid);
	rtmp = new SrsRtmpServer(skt);
	refer = new SrsRefer();
	bandwidth = new SrsBandwidth();
	security = new SrsSecurity();
	duration = 0;
	kbps = new SrsKbps();
	kbps->set_io(skt, skt);
	wakable = NULL;

	mw_sleep = SRS_PERF_MW_SLEEP;
	mw_enabled = false;
	realtime = SRS_PERF_MIN_LATENCY_ENABLED;
	send_min_interval = 0;
	tcp_nodelay = false;

	_srs_config->subscribe(this);
}

4)最底层的SrsStSocket类,要增加支持udp的实现。主要表现为

继承IRakNetDealer ,这样可以处理udp的数据。

class SrsStSocket : public ISrsProtocolReaderWriter, public IRakNetDealer

增加基于guid的构造

SrsStSocket(RakNetGUID guid);
SrsStSocket::SrsStSocket(RakNetGUID guid) :m_guid(guid), m_udp(true)
{
	
}

修改read write函数为raknet的实现。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值