编译的问题上一篇已经解决了。
这篇主要解决如何在代码层面来整合。只是大概的框架。还没有完全成熟。
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;
}
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的实现。